-1

写出函数eval1apply1

eval1使用一个关联列表(其中键是Symbol值是Num)和一个算术表达式,将变量名与值匹配。

apply1使用一个符号('+ 或 ')、一个表达式列表和一个关联列表,并计算将符号指定的函数应用于列表中的表达式所产生的数字。

例子:

(check-expect (eval1 '((x 2) (y 3) (z 4)) '(+ x (* y 2))) 8)
(check-expect (apply1 '* '(a (+ 3 b)) '((a 2) (b 1))) 8)

PS:eval1而且apply1应该是相互递归的。

4

1 回答 1

1

像这样:

(define (eval1 env exp)
  (cond ((number? exp) exp)
        ((symbol? exp)
         (cond ((assq exp env) => cadr)
               (else 'unbound-variable)))
        ((list? exp)
         (let ((operator (car exp))
               (operands (cdr exp)))
           (apply1 operator operands env)))))

(define (apply1 operator operands env)
  (case operator
    ((+) (+ (eval1 env (list-ref operands 0))
            (eval1 env (list-ref operands 1))))
    ((*) (* (eval1 env (list-ref operands 0))
            (eval1 env (list-ref operands 1))))
    (else 'unknown-operator)))

要认识到的重要一点是,如何评估表达式取决于表达式的性质。如果是数字/文字,则只返回数字/文字;如果是符号,则在环境中查找值;如果是列表,则将运算符应用于评估的参数。

于 2013-03-19T06:01:26.263 回答