[Haskell-cafe] A backwards-compatible record proposal

Brian Hulley brianh at metamilk.com
Sun Aug 20 06:54:07 EDT 2006


Bulat Ziganshin wrote:
> Hello Brian,
>
> Saturday, August 19, 2006, 12:21:34 PM, you wrote:
>
>> ie putting a '.' before each field name. The intended meaning is
>> that dotted field names do *not* generate top level functions.
>> Instead they allow the compiler to generate instance decls as
>> follows, where we've introduced a new form of identifier, the dotted
>> id, which behaves as a postfix operator which binds more tightly
>> than function application and can also be used as a class name (by
>> the compiler only):
>
>>     class (.x) :: a b | a -> b where
>>         (.x) :: a -> b
>
> this means that foo.bar should be parsed differently by _lexer_
> depending on is there any .bar field available in current or any
> imported module

Hi Bulat,
I just assumed that foo.bar would always be lexed as "foo" ".bar" so if 
composition was intended there would need to be a space between the "." and 
the "bar", but this breaks backwards compatibility (I hadn't thought of this 
when I made the proposal because I assumed everyone always writes "f . g" 
and not "f.g" when they mean composition but of course the latter is 
currently parsed as composition also).

>
> How about omitting '.' and using '#' operation for record access? the
> only problem will that '#' should have larger priority than ' '. i.e.
> function application. I had proposal on it, but it's too daring -
> raise priority of operations when they are written without spaces
> around, i.e.
>
> object#call x+y t#field z*2+1
>
> treated as
>
> (object#call) (x+y) (t#field) (z*2+1)

Intuitively this makes sense, because you'd expect no spaces to mean "glue 
this together as tight as possible", but on the other hand I personally find 
the second version with brackets is visually much easier to read even though 
it's a bit more inconvenient to write.

But
    1) The first version is not backwards compatible either.
    2) object#call should not be treated as (object # call) because it means 
((#call) object) so whatever symbol is used for field selection, it needs to 
be glued onto the field name by the lexer not the parser.

Also I was hoping to be able to use the "." so that field access would 
follow the C, C#, Java conventions and because # is used by ghc to mean 
"unboxed" so the following might be confusing:

    object#call 1# x#y # k (#g,a#)

    object.call 1# x.y # k (#g,a#)

ie
    ((object.call) 1# (x.y)) # (k (# g, a #))

Best regards,
Brian
-- 
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.

http://www.metamilk.com 



More information about the Haskell-Cafe mailing list