[Haskell-cafe] Lambda and closures in PHP -- could someone please comment?

Jules Bean jules at jellybean.co.uk
Fri Jun 20 07:34:01 EDT 2008


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


More information about the Haskell-Cafe mailing list