我对球拍中'
标志的含义感到有些困惑。在我看来,同一个标志有不同的含义。请看下面的两个简单示例:
返回一个新分配的列表,其中包含vs作为其元素。
> (list 1 2 3 4)
'(1 2 3 4)
生成对应于 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 `#<'
答案 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 ]]]]]
根据列表的通常表示形式为数据对和列表的其余部分(此处显示一对a
和b
为[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
逐字逐句返回;结果是一样的。