Racket 中的 '(撇号)是什么?

What is ' (apostrophe) in Racket?

我对球拍中'签到的含义有点困惑。在我看来,同一个符号有不同的含义。请看下面的 2 个简单示例:

list

Returns a newly allocated list containing the vs as its elements.

> (list 1 2 3 4)
'(1 2 3 4)

quote

Produces a constant value corresponding to datum (i.e., the representation of the program fragment) without its lexical information, source location, etc. Quoted pairs, vectors, and boxes are immutable.

> '(1 2 3 4)
'(1 2 3 4)

所以我的问题是: ' 符号是否有两种含义(符号列表)或者它们是相同的数据类型和 list 实际上 returns 一个 引用的常量值 ?如果是第二种情况,为什么会这样:

> '(+ (- 2 13) 11)
'(+ (- 2 13) 11)

> (eval (list + (- 2 13) 11))
0

(也 (eval '(+ (- 2 13) 11)) 工作并正确评估 0

但这不是:

> (list + (- 2 13) 11)
'(#<procedure:+> -11 11)

> (eval '(#<procedure:+> -11 11))
. read: bad syntax `#<'

可能相关: What is ' (apostrophe) in Lisp / Scheme?

您对 #lang racket 打印值的默认方式感到困惑,这与几乎所有其他交互式 lisp 环境不同。如果您在 DrRacket 本身中选择另一种语言,例如 R5RS,您会发现它打印:

> (list 1 2 3 4)
(1 2 3 4)

运算符 list应用于数字1 2 3 4的结果是产生这些数字的列表,这正是解释(1 2 3 4).

所以,答案是 What is ' (apostrophe) in Lisp / Scheme? 也适用于您的情况,'anything 只是 (quote anything).

的缩写

> 是 REPL 的标志 - Read-Eval-Print Loop。

首先,您在 REPL 提示符下键入的任何表达式都是 read - 转换为某种内部抽象语法树表示。然后这个输入表达式的内部表示是 evaluated - 即找到它的值。然后打印结果。

当我们打字时

> (list 1 2 3 4)

输入的表达式被读取为嵌套结构,让我们将其写为

[LIST | [1 | [2 | [3 | [4 | NIL ]]]]]

根据列表通常表示为数据对和列表的其余部分(这里显示一对ab[a | b])。

然后对上面的结构进行求值,因为它的第一个元素是 LIST,它会导致使用指定的参数调用 list,这会导致构建一个新的列表结构,这可以表示为

[1 | [2 | [3 | [4 | NIL ]]]]

然后打印出来,通常是(1 2 3 4)但是Racket选择打印成'(1 2 3 4)。顺带一提,不能求值,因为1不能.

接下来,引用表达式'(1 2 3 4),读作(quote (1 2 3 4))。转换成

[QUOTE | [ [1 | [2 | [3 | [4 | NIL ]]]] | NIL ]]

其中,在评估时(根据 quote 的评估规则),returns 它收到的 data。我们表示为

[1 | [2 | [3 | [4 | NIL ]]]]

这就是两者相似的原因。我们是否构建一个包含 1、2、3 和 4 的新列表;或者我们让它作为 read 过程的一部分创建,所以它会被 quote 逐字返回;结果是一样的。