为啥 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 在没有引号的情况下评估符号本身?的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个在 Common Lisp 中漂亮地打印宏扩展的宏不起作用?都有哪些替代工具?
为啥这个 Common Lisp 宏不起作用?书上的答题卡错了吗?