如何解决为什么 Common Lisp 在没有引号的情况下对符号进行评估?
我已经习惯了 Racket,我正在努力学习 Common Lisp。在 Racket 中,符号对自身进行评估,如 Dr Racket 的 REPL 所示:
> 'racket
'racket
在 Common Lisp 中,根据文献,符号也会对自身求值。
实际上,引用对象的评估规则是:
带引号的对象计算为对象本身,不带引号。
在使用 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 不会在交互窗口中为您提供结果。它的作用是打印一个相等的表达式,该表达式的计算结果也相同。设计 Racket 的团队认为这在学习过程中更容易,但由于这些问题,我倾向于不同意。
Standard Racket 将 'common-lisp
计算为 common-lisp
,因此获取表达式以对其进行计算的一种方法是引用它,以便它在 REPL 中显示 ' common-lisp
。
这与一个以 16 为基数显示数字而另一个以 10 为基数的实现几乎相同。结果 B 和 11 是相同的,只是可视化不同。
您可以在 Dr Racket 中的语言选项中更改输出格式以获得实际值。某些语言,例如标准方案报告方案已经具有此功能。
,在 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。