List syntax (was: Re: help from the community?)
Brian Hulley
brianh at metamilk.com
Sat Feb 3 02:55:52 EST 2007
Douglas Philips wrote:
> On 2007 Feb 2, at 11:25 PM, Brian Hulley indited:
>> Apart from the extra possibility for errors (yes I understood that
>> you'd define it to not be an error but this doesn't change the fact
>> that for people who always wrote their tuples using the normal
>> mathematical convention not using an optional trailing comma it
>> would be an error in their code)
>
> Well it would now, but in my proposal it wouldn't be. So it would not
> make any correct code incorrect.
Of course, but when I said "error" I meant "error with respect to the
intentions of the programmer" not "syntax error detected by the compiler".
The problem with your proposal is that if optional trailing commas were
allowed, if *I* wrote:
(1,2,)
by mistake, forgetting to add in the last element, the fact that the
compiler would now treat the trailing comma as optional means it would now
accept the code as being syntactically ok. If *you* wrote that same code, it
*would* correspond to what you meant ie just (1,2), for me it would not
because I'd have meant to write something like (1,2,3), so for me, instead
of a nice simple syntax error I'd get a confusing type error possibly
somewhere else in the code therefore my net productivity would be reduced.
However a compiler option could be used to switch the optional trailing
comma feature on and off and therefore suit everyone.
>
>> to go undetected, it would just substitute one inconsistency for
>> another: as Malcolm pointed out the syntax (,,) represents the
>> constructor for a 3-tuple therefore:
>>
>> let a = (x,y,) -- in your proposal a 2-tuple
>> let b = (,,) x y -- still a 3-tuple with a missing element
>
> Prelude> :t (1,2,) 3
> ERROR - Syntax error in expression (unexpected `)')
> Prelude> :t (1,2,)
> ERROR - Syntax error in expression (unexpected `)')
> Prelude>
>
> Again, this would not break existing code, since there is no
> mechanism for section'd tuples.
What I meant was that the number of commas for a constructor is fixed:
always 2 commas means a constructor for a 3-tuple. However you'd now have a
choice of how many commas to use when writing out the "sugared" saturated
application - either 2 or 3 commas. Which seems inconsistent, since in 5
years time someone used to always writing a pair like:
let pair = (1,2,) -- trailing commas now very popular
might quite sensibly want to write this as
let pair = (,,) 1 2
(since the whole point of the (,,) syntax is that the number of commas is
the same as that used when writing out the value in tuple notation) but we
can't have a programmer choice when it comes to the constructor: the
compiler writer must choose one way or the other. So I don't think there
should be a choice in the sugar syntax either. Then if we choose to use (,,)
to represent the pair constructor because of the popularity of trailing
commas in the applied syntax, this would beg the question of what (,) would
represent hence the "spectre" of introducing 1-tuples...
>> Also, I think in maths the convention is to use commas as
>> separators when writing down coordinates etc.
>
> ??? I don't quite get the applicability here...
Perhaps it is not applicable, but I thought a guiding principle of Haskell
syntax was to try and stay as close to normal mathematical notation where
possible, and I remember learning 2d coordinates in school as (x,y) not
(x,y,).
>
>
>> From a personal aesthetic point of view the appearance of a
>> trailing comma is highly irritating to me like passing a shelf in a
>> shop where someone has left a book "unsettled" with the cover
>> twisted over the edge at an annoying angle and some pages crumpled
>> up, that forces me to stop and fix it... :-)
>
> Well, if we're going to bring personal points of view in, it highly
> pisses me off that in a construct such as:
> ( expr ,
> expr ,
> expr ,
> expr ,
> expr ,
> )
> I have to be vigilant to remove that trailing comma when it is in _no
> way_ ambiguous.
I know, I find the need to manually delete and insert commas extremely
tedious as well. This is why I proposed:
#(
expr
expr
as sugar for (expr, expr), because it seems crazy to me that we've got all
the machinery in place in the form of the layout rule yet we can only use it
for a handful of built in constructs, when everywhere else we still need to
juggle with commas and try to make parentheses as invisible as possible eg:
bracket_
(enter a)
(exit a)
(do
b
c) -- looks like LISP...
instead of just:
#bracket_
enter a
exit a
do
b
c
> [snip]
> I don't think we're ever going to get agreement on apparently
> irreconcilable personal aesthetics, but perhaps we can apply some
> principles, such as regularity and consistency and both get what we
> want?
The #( sugar would only go part of the way to address your proposal since it
doesn't address tuples written inline. But a compiler option for allowing
the optional trailing comma could be used so that people who prefer the
existing syntax (and who might rely on the positive enforcement of "no
trailing commas allowed" to catch some of their mistakes) would not be
affected.
Another possibility would be to allow trailing semicolons in the {;} syntax,
then the #( sugar would work - you could just write:
#( {a;b;c;}
>
>> Regarding import/export lists,...
>> ...
>> (Though the above is obviously too radical a departure for Haskell')
>
> Perhaps too radical? but I like it. I am all for eliminating syntax
> noise whenever/wherever unambiguously possible, and for making what
> remains as _regular_ as possible. Sometimes it is the foolish
> inconsistencies which are the hobgoblins...
I agree. Some particularly warty hobgoblins are:
(-1) as opposed to (+1)
f (x+3) = g x but not f (x * 3) = g x
though a problem with Haskell' is the conflict between the knowledge of
these pesky warts and the desire to maintain backwards compatibility with
H98, hence we may need to wait till the next major revision to see them
finally vanquished.
Best regards, Brian.
--
http://www.metamilk.com
More information about the Haskell-prime
mailing list