【问题标题】: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 打下基础。

谢谢

【问题讨论】:

    标签: common-lisp racket symbols language-design evaluation


    【解决方案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,但并非必须如此。
      猜你喜欢
      • 2018-01-29
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2011-04-20
      • 2019-01-18
      • 2012-07-31
      相关资源
      最近更新 更多