You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
27 lines
1.4 KiB
27 lines
1.4 KiB
|
|
Exercise 4.31: The approach taken in this
|
|
section is somewhat unpleasant, because it makes an incompatible change to
|
|
Scheme. It might be nicer to implement lazy evaluation as an
|
|
|
|
upward-compatible extension, that is, so that ordinary Scheme
|
|
programs will work as before. We can do this by extending the syntax of
|
|
procedure declarations to let the user control whether or not arguments are to
|
|
be delayed. While we’re at it, we may as well also give the user the choice
|
|
between delaying with and without memoization. For example, the definition
|
|
|
|
|
|
(define (f a (b lazy) c (d lazy-memo))
|
|
…)
|
|
|
|
would define f to be a procedure of four arguments, where the first and
|
|
third arguments are evaluated when the procedure is called, the second argument
|
|
is delayed, and the fourth argument is both delayed and memoized. Thus,
|
|
ordinary procedure definitions will produce the same behavior as ordinary
|
|
Scheme, while adding the lazy-memo declaration to each parameter of
|
|
every compound procedure will produce the behavior of the lazy evaluator
|
|
defined in this section. Design and implement the changes required to produce
|
|
such an extension to Scheme. You will have to implement new syntax procedures
|
|
to handle the new syntax for define. You must also arrange for
|
|
eval or apply to determine when arguments are to be delayed, and
|
|
to force or delay arguments accordingly, and you must arrange for forcing to
|
|
memoize or not, as appropriate.
|
|
|