为什么 Common Lisp 会在没有引号的情况下对符号求值?

Why Common Lisp evaluates a symbol to itself without the quote?

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

> 'racket
'racket

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

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

A quoted object evaluates to the object itself, without the quote.

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

> 'common-lisp
common-lisp

我觉得我需要了解两种语言设计之间的对比

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

我是否遗漏了有关 CLOS 的一些深刻的东西?

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

谢谢

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

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

Standard Racket 将 'common-lisp 计算为 common-lisp,因此让表达式对其进行计算的一种方法是引用它,以便它在 REPL 中显示 ' common-lisp

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

您可以在 Dr Racket 的语言选项中更改输出格式以获得实际值。一些语言,比如标准方案报告方案已经有这个。

In Common Lisp, according to the literature, symbols also evaluate to itself

没有。只有以自己为价值的符号才会对自己求值。

CL-USER 17 > foo

Error: The variable FOO is unbound.

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

CL-USER 19 > 'foo     ; same as (quote foo)
FOO

可以将FOO的符号值设置为FOO本身:

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

CL-USER 21 > foo
FOO