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

时间:2015-11-18 12:06:35

标签: functional-programming scheme racket

我对球拍中'标志的含义感到有些困惑。在我看来,同一个标志有不同的含义。请看下面的两个简单示例:

list

  

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

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

quote

  

生成对应于 datum 的常量值(即程序片段的表示),而不包含词汇信息,源位置等。引用的对,向量和框是不可变的。

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

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

2 个答案:

答案 0 :(得分:6)

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

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

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

所以,答案是 What is ' (apostrophe) in Lisp / Scheme?也适用于您的情况,(1 2 3 4)只是'anything的缩写。

答案 1 :(得分:3)

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

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

当我们输入

> (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的评估规则),返回收到的数据。我们代表的是

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

这就是两者相似的原因。我们是否建立一个包含1,2,3和4的新列表;或者我们将其作为 read 进程的一部分创建,因此quote逐字逐句返回;结果是一样的。