Previous: Defining sequence types, Up: Macros for writing loops
Here is an example of the expansion of the reduce macro:
(reduce ((list* x '(1 2 3)))
((r '()))
(cons x r))
==>
(let ((final (lambda (r) (values r)))
(list '(1 2 3))
(r '()))
(let loop ((list list) (r r))
(if (null? list)
(final r)
(let ((x (car list))
(list (cdr list)))
(let ((continue (lambda (r)
(loop list r))))
(continue (cons x r)))))))
The only mild inefficiencies in this code are the final &
continue procedures, both of which could trivially be
substituted in-line. The macro expander could easily perform the
substitution for continue when there is no explicit proceed
variable, as in this case, but not in general.