编写函数eval1
和apply1
。
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:eval1
和apply1
应该是相互递归的。
答案 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)))
要认识到的重要一点是,如何评估表达式取决于表达式的性质。如果是数字/文字,只需返回数字/文字;如果是符号,请查看环境中的值;如果是列表,则将运算符应用于已计算的参数。