设计一个for循环:
(for <init> <condition> <update>
<body>)
(for ((a 0) (b 1))
(and (< a 10) (< b 11))
((set! a (+ a 1)) (set! b (+ b 1)))
(print a)
(print b))
实现代码如下:
(define (for-init-vars exp) (map car (cadr exp)))
(define (for-init-vals exp) (map cadr (cadr exp)))
(define (for-condition exp) (caddr exp))
(define (for-update exp) (cadddr exp))
(define (for-body exp) (cddddr exp))
(define (for->combination exp)
(cons (make-lambda (for-init-vars exp)
(list 'define
'(iter)
(make-if (for-condition exp)
(sequence->exp (append (for-body exp)
(append (for-update exp)
(list '(iter))))))))
(for-init-vals exp)))
((for? exp) (eval (for-combination exp) env))