我目前正在学习计划,作为我正在修的课程的一部分。它被教导给我的方式是慷慨地使用eval表达式,并且我正在测试的大多数示例都不像描述的那样工作。我读得越多,显然我就不应该这么随意地使用eval了。我在javaScript中看到了一些规避方法,但我正在寻找一些特定的方案。
这个链接提供了一些信息,说明在什么时候可能有必要。这并不能帮我找到一个好的规避方法。
这个链接有更好的信息,但没有给出任何方法来避免在我的情况下。
这个链接最接近于回答我的问题,并帮助我理解了为何eval不一定像预期的那样工作,但我仍然不清楚,什么才能很好地替代eval表达式。
我正在寻找的是标准的方式来实现这一点:
(define (add a_list)
(cond
((null? a_list) 0)
(eval(cons '+ a_list)))
)
(add '(3 4 8 12 30))如果不使用eval,则返回57。目前它返回(+ 3 4 8 12 30)。这个链接似乎暗示,(+ 34)将自动计算为7,但我得到的只是打印给我的列表,作为一个没有计算的表达式。
它将很好地写成以下方式:
(define (add a_list)
(cond
((null? a_list) 0)
(eval(eval(cons '+ a_list))))
)
(add '(3 4 8 12 30))返回57,但其中一个evals似乎什么也不做。以及:
(define (add a_list)
(eval(cons '+ a_list))
)
(add '(3 4 8 12 30))返回57,但不检查空列表。
任何帮助完全删除它(或只使用它,如果绝对必要),将不胜感激。
提前感谢!
发布于 2020-11-08 18:28:25
对于前面提到的例子,您不需要eval,一个简单的apply就可以工作。而且你的怀疑是正确的,我们大多数时候都应该避免使用eval --它被认为是“邪恶的”。
(define (add a_list)
(apply + a_list))https://stackoverflow.com/questions/64740349
复制相似问题