在这种情况下如何写“eval”和“apply”?

时间:2013-03-19 05:15:56

标签: scheme

编写函数eval1apply1

eval1使用关联列表(其中键为符号,值为 Num )和算术表达式,将变量名称与值匹配。< / p>

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:eval1apply1应该是相互递归的。

1 个答案:

答案 0 :(得分: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)))

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