5 ms·
Can someone explain how this works? I understand that (label second '(...)) makes second evaluate to that in the future, statefully, but, the lambda symbol doe
by indspenceable 15y ago
Can someone explain how this works?
I understand that (label second '(...)) makes second evaluate to that in the future, statefully, but, the lambda symbol doesn't even appear to have a definition; furthermore, if you try to use it in a way that would work with a real lambda, it doesn't work.
For instance
[[:lambda, [:x], :x], 2]
- TomasSedovic 15y agoTake a look at the second line in the `apply` definition[1]: self.eval @env[fn][2], Hash[*(@env[fn][1].zip args).flatten(1)] It's triggered when the `fn` is not callable, i.e. when we pass in lambda: [:lambda, [:x], [:car, [:cdr, :x]]] The code ignores the `:lambda` symbol (that would be `@env[fn][0]`). It evals the third element of the list (the lambda body) in a new context that combines `@env` and the binding of lambda's args to the symbols in the lambda's definition -- that's what the `Hash` mumbo jumbo creates. [1]: https://github.com/fogus/ulithp/blob/b02d5806ce3b2d3766311c2384f8eeb31e4bee48/lithp.rb#L15 https://github.com/fogus/ulithp/blob/b02d5806ce3b2d3766311c2...