How can letrec
be implemented without using set!
?
It seems to me that set!
is an imperative programming construct, and that by using it, one loses the benefits of functional programming.
Unlike let , letrec makes new bindings visible before they're initialized. Storage is allocated, and the meanings of names are changed to refer to the new local variable bindings, and then the initial values of those variables are computed and the variables are initialized.
letrec supports the creation of recursive local procedures, including mutually recursive sets of procedures. let* supports the sequenced binding of variables, where each initial value expression can use the previous bindings.
I know usually we ask content to be copied but there is no short answer to your question. http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf
No. Just because a functional feature is implemented with imperative code behind the scenes, that doesn't make the feature be imperative. Our computing machines are all imperative; so at some point all functional code must be implemented by translation into imperative code!
The key thing to understand here is this: functional programming pertains to interface, not to implementation. A piece of code is functional if that code itself is unable to observe any side effects—even if side effects are in fact happening behind the scenes. I.e., if you check the value of the same binding of the same variable multiple times, you will get the same value—even if that value, behind the scenes, was put there by a use of set!
.
In the case of letrec
, there is a little catch here: the result is undefined if the evaluation of any of the bindings in the letrec
causes another one to be derefenced. So, the result of this code is undefined:
(letrec ((foo bar)
(bar 7))
(cons foo bar))
The value of foo
in the body of the letrec is undefined. The result of the following, on the other hand, is defined:
(letrec ((foo (lambda () bar))
(bar 7))
(cons (foo) bar))
This is because evaluating the lambda
captures the reference to bar, but the actual value is not looked up until the closure is executed in the body.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With