Derek Elkins wrote:
Lambda abstractions should close over bindings.  Full stop.

Interesting. I agree with your analysis. I don't think I agree with your conclusion.


The first "surprising" behaviour is the correct one.  The latter would
be broken.

In my opinion, the reason this behaviour is "surprising" isn't
mutability, but -implicit- mutability.  Let's make bindings immutable,
but add ML-style references to your example.

char ref c = ref(undefined);
while(!eof(fp)) {
    c := getChar(fp);
    bind_event( ... print !c; ... );
}

compare this to

while(!eof(fp)) {
    char c = getChar(fp);
    bind_event( ... print c; ...);
}

or

while(!eof(fp)) {
    char ref c = ref(getChar(fp));
    bind_event( ... print !c; ...);
}

Each of these examples makes it clearer what is going on.

Agreed.

I think where I differ on you is how to map the semantics of a C-like language to explicit references.

I would argue that the glyph "c" in a C-like language denotes the value of C, not the reference to it. C-like languages have, for the most part, value semantics, and call-by-value.

The exception of course is what C-like languages called "lvalues", but lvalues are only really on the left of the = sign and a few other special positions. I think that's the exception and not the rule. I think the rule is that "c" denotes the value of c, and that's why I expect a closure to capture the value, not the reference.

In C, of course, if you want to capture the reference you do it explicitly with "&c".

Jules
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to