4

我对'球拍标志的含义有点困惑。在我看来,同一个符号有不同的含义。看下面两个简单的例子:

list

返回一个新分配的列表,其中包含 vs 作为其元素。

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

quote

产生一个对应于数据(即程序片段的表示)的常量值,没有它的词法信息、源位置等。引用的对、向量和框是不可变的。

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

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

> '(+ (- 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 `#<'

可能相关: Lisp / Scheme中的'(撇号)是什么?

4

2 回答 2

7

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

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

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

那么, Lisp / Scheme 中什么是 '(撇号)的答案 ?也适用于您的情况,并且'anything只是 . 的缩写(quote anything)

于 2015-11-18T12:30:31.433 回答
4

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

首先,您在 REPL 提示符下键入的任何表达式都会被读取- 转换为一些内部抽象语法树表示。然后计算输入表达式的这个内部表示- 即找到它的值。然后打印结果。

当我们输入

> (list 1 2 3 4)

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

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

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

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

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

然后它被打印出来,通常是 as(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),返回它收到的数据。我们表示为

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

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

于 2015-11-18T16:46:46.790 回答