为什么 Common Lisp 在没有引号的情况下对符号进行评估?

Ped*_*ino 3 evaluation symbols language-design common-lisp racket

我习惯了 Racket,我正在努力学习 Common Lisp。在 Racket 中,符号对自身进行评估,如 Dr Racket 的 REPL 所示:

> 'racket
'racket
Run Code Online (Sandbox Code Playgroud)

根据文献,在 Common Lisp 中,符号也会对自身求值。

实际上,引用对象评估规则是:

带引号的对象计算为对象本身,不带引号。

在使用 REPL(Common Lisp、SBCL 和 Slime)时,我得到:

> 'common-lisp
common-lisp
Run Code Online (Sandbox Code Playgroud)

我觉得我需要接受有关两种语言设计之间对比的教育。

为什么会这样?考虑到 CL 的设计作为一种语言,这样做有什么意义?

我是否错过了关于 CLOS 的深刻见解?

我仍在为在不久的将来更好地了解 CLOS 打下基础。

谢谢

Syl*_*ter 10

TL;DR:这与 Common Lisp 无关。这就是 DrRacket REPL 的工作原理。你不能用 Racket 来学习 CL

带有#lang racketas 语言和未更改选项的 Dr. Racket REPL不会在交互窗口中为您提供结果。它的作用是打印一个相等的表达式,该表达式的计算结果也相同。设计 Racket 的团队认为这在学习过程中更容易,但由于这些问题,我倾向于不同意。

标准 Racket 的计算结果'common-lisp为,common-lisp因此获取表达式以对其进行计算的一种方法是引用它,以便它显示' common-lisp在 REPL 中。

它与一个以 16 为基数显示数字而另一个以 10 为基数的实现几乎相同。结果 B 和 11 是相同的,只是可视化不同。

您可以在 Dr Racket 中的语言选项中更改输出格式以获得实际值。某些语言,例如标准方案报告方案已经具有此功能。


Rai*_*wig 6

在 Common Lisp 中,根据文献,符号也对自身求值

不。只有以自身为价值的符号才会对自身求值。

CL-USER 17 > foo

Error: The variable FOO is unbound.
Run Code Online (Sandbox Code Playgroud)

通常我们需要引用一个符号。带引号的符号计算为该符号。

CL-USER 19 > 'foo     ; same as (quote foo)
FOO
Run Code Online (Sandbox Code Playgroud)

可以将的符号值设置FOOFOO自身:

CL-USER 20 > (set foo 'foo)
FOO

CL-USER 21 > foo
FOO
Run Code Online (Sandbox Code Playgroud)