首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(eval '(+ 12))和(eval (+ 12))之间的差异?

(eval '(+ 12))和(eval (+ 12))之间的差异?
EN

Stack Overflow用户
提问于 2011-04-12 15:42:23
回答 3查看 271关注 0票数 2

clisp中,有什么不同?

代码语言:javascript
运行
复制
(eval '(+ 1 2))

(eval (+ 1 2))
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-12 15:53:04

第一种方法将列表(+ 1 2)传递给eval函数,该函数将计算该表达式,并生成答案,3.表达式'(+ 1 2)是引用表达式的一种方式,因此表达式可以按字面顺序作为数据传递,而不是立即计算。然后将其传递给eval函数,然后对其进行计算。

第二个将计算表达式(+ 1 2),以获得结果3,然后将其传递给eval函数。数字计算为自身,因此它将返回与第一种情况相同的答案,即3。

票数 7
EN

Stack Overflow用户

发布于 2011-04-12 15:52:40

似乎(eval (+ 12))首先计算(+ 12),然后使用(eval 3)。

(eval '(+ 1 2))将表达式(+ 12)转换为eval,让eval来解释它。

票数 3
EN

Stack Overflow用户

发布于 2011-09-17 08:18:30

所有函数(除了原语和一些特殊的函数),比如eval,首先计算它们的所有参数,然后将它们传递到它们的函数体中。

然而,人们可以通过引用论点来抑制对论点的评估。在这种情况下,S表达式本身作为参数传递,而不是首先计算它。

(eval (+ 12)) =>第一(+ 12)被求值=> (eval 3) =>给出答案3

(eval '(+ 12)) =>引号阻止参数得到求值,=> (+ 12)作为参数=>传递,但是S-表达式的计算结果也是3。

下面的例子可以更好地理解两者之间的区别:

(eval (+ 1 2) (+ 3 4)) =>这变成了(eval (3 )) => --这会产生"3不是函数“的错误,因为要计算的S表达式是(3 )

(eval '(cons (+ 1 2) (+ 3 4)) =>这就像在这个S-表达式的REPL =>计算中键入(+ 12) (+ 34),给出结果(3.7)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5638018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档