我想评估以下内容:(eval-expr '(times x x) '((x ((plus y x) ((x 2) (y 3))))))
这是使用方案的懒惰评估。我一直收到以下错误:
mcar: expects argument of type ; given 3
总体答案是25,但你必须通过获取(plus y x)
的值并将其分配给环境的头部来做到这一点。 (plus y x)
是上述表达式的caadr
,环境是cadadr
。我不确定我做错了什么,代码看起来是正确的。
第4行处理这种情况。
(define (eval-expr E env)
(cond
((eqv? (car E) 'plus) (apply + (eval-params (cdr E) env)))
((eqv? (car E) 'times) (apply * (eval-params (cdr E) env)))
((eqv? (car E) 'divide) (apply / (eval-params (cdr E) env)))
((eqv? (car E) 'minus) (apply - (eval-params (cdr E) env)))
(else '()))) ; confused - return ()
(define (eval-params E env)
(if (null? E) '()
(cons (eval-expr (car E) env)
(eval-params (cdr E) env))))
答案 0 :(得分:2)
根据您的评论,看起来您正在实施一种惰性语言,其中环境包含承诺,并且在评估承诺时,您应该改变环境以包含新值。
我的建议:设计一些辅助功能。第一个:接受表示变量名称和环境的符号的函数,并返回该变量的值,其副作用是改变环境以包含更新的绑定。在这种情况下,你可能想要另一个辅助函数接受单个绑定,评估它的右侧,然后改变它以包含新值。
请务必彻底 TEST 这些辅助功能。