我想评估以下几点:(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))))
发布于 2011-11-04 02:34:35
根据您的评论,看起来您正在实现一种懒惰语言,其中环境包含promise,当评估promise时,您应该改变环境以包含新值。
我的建议:设计几个helper函数。首先:一个函数,它接受一个表示变量名和环境的符号,并返回该变量的值,其副作用是改变环境以包含更新后的绑定。在这种情况下,您可能需要另一个辅助函数,该函数接受单个绑定,计算其右侧的值,然后对其进行修改以包含新值。
务必彻底测试这些帮助器函数。
https://stackoverflow.com/questions/7975006
复制相似问题