【问题标题】:Unexpected eval result in CLISPCLISP 中的意外评估结果
【发布时间】:2018-08-23 09:46:37
【问题描述】:

我运行以下 CLISP 代码,但结果对我来说看起来很奇怪。

(setq a 'b)
(setq b 'c)
(setq c 'd)
(setq d 8)
(eval a)
(eval c)
(eval (eval a))

最后三行的输出是:

C

8

D

我如何理解输出?

最后两行怎么会有不同的输出?

请帮忙解释一下,非常感谢!

【问题讨论】:

    标签: lisp common-lisp eval


    【解决方案1】:

    评估(eval c)

    1. 获取变量c的值->符号D
    2. 使用符号D -> 编号8调用EVAL

    评估(eval (eval a))

    1. 获取变量a的值->符号B
    2. 使用符号 B -> 符号 C 调用 EVAL
    3. 用符号C调用EVAL -> 符号D

    Lisp 的一些基本评估规则

    • 符号求值
    • 一个数字对自己求值
    • (foo-function arg) 列表首先评估参数,然后使用评估的参数调用函数 foo-function
    • 列表(quote something) 原样返回something(不管它是什么)

    【讨论】:

    • 谢谢你的回答,我可以这样理解吗:表达式(如c)的结果被认为是(引用c),但是,当一个符号被显式写入时,它将是被认为是它的价值?
    • @DUjio:表达式c的结果是c的值。 (quote c) 的结果是符号 c。 b 的结果是符号c。请注意,您的结果中没有引用值 - 结果中有符号和数字。
    • 感谢您的耐心和清晰的解释,这是我第一次使用堆栈溢出,没想到我会这么快得到回复!
    • @Dujio:这是一个典型的 Lisp 初学者问题,理解这些评估规则很重要,因为在 Lisp 中编程时需要它。因此提出这些问题非常有用,因为这部分是一个真正的初始障碍:评估、符号、eval 作为函数、quote 作为运算符...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多