为啥 Common Lisp 在没有引号的情况下评估符号本身?

Posted

技术标签:

【中文标题】为啥 Common Lisp 在没有引号的情况下评估符号本身?【英文标题】:Why Common Lisp evaluates a symbol to itself without the quote?为什么 Common Lisp 在没有引号的情况下评估符号本身? 【发布时间】:2021-08-06 03:55:11 【问题描述】:

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

> 'racket
'racket

根据文献,在 Common Lisp 中,符号也会对自身进行评估。

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

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

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

> 'common-lisp
common-lisp

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

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

我是否错过了一些关于 CLOS 的深刻意义?

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

谢谢

【问题讨论】:

【参考方案1】:

在 Common Lisp 中,根据文献,符号也会对自身进行评估

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

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

【讨论】:

【参考方案2】:

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

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

标准 Racket 将 'common-lisp 评估为 common-lisp,因此获取表达式以评估相同的方法是引用它,以便它在 REPL 中显示 ' common-lisp

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

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

【讨论】:

是的,Common Lisp 校友在这里,而且 Racket 将符号打印为 'example 的事实总是让我陷入循环。我发现自己一直在想我不小心在某处引用了某些东西。这只是惯例和您习惯的问题。 可能值得补充的是,这可以通过 Racket 的 print-as-expression 参数进行控制,默认情况下为 true,但并非必须如此。

以上是关于为啥 Common Lisp 在没有引号的情况下评估符号本身?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Lisp 中的单引号总是返回大写?

Common lisp——为啥这个符号不是外部的?

为啥这个在 Common Lisp 中漂亮地打印宏扩展的宏不起作用?都有哪些替代工具?

为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?

在 Common Lisp (SBCL) 中处理和最小化内存使用

在 Common Lisp 中使用的最佳 SQL 库是啥? [关闭]