さかもとのブログ

つらつらと

演習問題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))