微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 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 举报,一经查实,本站将立刻删除。