On Thu, Oct 27, 2016 at 7:12 AM, Martin Karlgren marty@roxen.com wrote:
26 okt. 2016 kl. 21:23 skrev Chris Angelico rosuav@gmail.com:
On Thu, Oct 27, 2016 at 6:08 AM, Martin Karlgren marty@roxen.com wrote: A possible workaround is to cut the reference to the “foo” frame:
function f = lambda(string var1, string var2) { return lambda(string arg) { write("%O, %O, %O\n”, var1, var2, arg); }; }(var1, var2);
However, this is pretty verbose.
More significantly, this is *early binding* semantics. It captures the current values of var1 and var2, and won't notice any other changes.
Yep – don't know about other people but I don't think I've ever really wanted "late binding", so I think that's a good thing.
I have, often. It's also the same semantics as most other languages have for their closures. The most normal way to work with closures should be late-binding and writeable.
Whether it's worth having a "snapshot" syntax that is strictly syntactic sugar for the above, now, that's a separate question. In the times where you *want* late binding, this is the one obvious way to do it, and as you say, it's pretty verbose.
ChrisA