This part is tricky, which took me several hours to make it.
''*unassigned* needs two single quotes. Because '*unassigned* is the value
of a variable.
The returned value should be in a list.
The (null? let-body) should be used, otherwise it would loop forever.
4.17
There is an extra frame in the transformed program because let is transformed to a lambda call.
To make the scope role “simultaneous” without creating a new frame, the internal definations could
be extract to the top before being runned.
4.18
Both this version and the original version would not work, as the values of u and v are
evaluated directly without through other proxy values.
4.19
The footnote gives the opinion of the author.
It is complicated implement the simutaneous, even though Topological sort could be used to deal with
simple defination order problem.
But when the mutual_recursion happens, it would not be possible to get the actual defination order at all.
For racket:
4.20
letrecis evaluated includes all the letrec bindings, while let is not.
4.21
$\lambda$ makes functional programming possible.
4.22
Analyze is able to handle it.
4.23
execute-sequence has cond and other extra commands, while the text version
is just some runnable procedure.
4.24
For original version: $3.302853$ second, while for optimized version $2.106789$ second.