演習問題4.6, 4.7
評価器を作っているので,mapを使うのに少し抵抗を感じる.
;;exercise4.6 ;evalの中 ((let? exp) (eval (let->combination exp) env)) === (define (let? exp) (tagged-list? exp 'let)) (define (let-clauses exp) (cdr exp)) (define (let-bindings exp) (car (let-clauses exp))) (define (let-body exp) (cdr (let-clauses exp))) (define (let->combination exp) (define bindings (let-bindings exp)) (define body (let-body exp)) (if (null? bindings) '() (cons (make-lambda (map car bindings) body) (map cadr bindings)))) ;;exercise4.7 ;evalの中 ((let*? exp) (eval (let*->nested-lets exp) env)) ==== (define (let*? exp) (tagged-list? exp 'let*)) (define (let*->nested-lets exp) (define bindings (let-bindings exp)) (define body (let-body exp)) (define (loop bindings body) (if (null? bindings) (car body) (list 'let (list (car bindings)) (loop (cdr bindings) body)))) (loop bindings body))