さかもとのブログ

つらつらと

SICP演習問題4.4

評価器のprimitive-proceduresにandとorを追加するのを忘れずに.

;;exercise4.4
(define (and? exp)
  (tagged-list? exp 'and))

(define (or? exp)
  (tagged-list? exp 'or))

(define (eval-and exps env)
  (if (null? exps)
      #f
      (let eval-and-loop ((exps (cdr exps)))
        (if (null? exps)
            #t
            (cond [(true? (eval (car exps) env))
                   (eval-and-loop (cdr exps))]
                  [else #f])))))

(define (eval-or exps env)
  (let eval-or-loop ((exps (cdr exps)))
    (if (null? exps)
        #f
        (if (true? (eval (car exps) env))
            #t
            (eval-or-loop (cdr exps))))))