什么是'(撇号)在球拍?

fer*_*tor 2 scheme functional-programming racket

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

list

返回包含vs作为其元素的新分配列表.

> (list 1 2 3 4)
'(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

quote

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

> '(1 2 3 4)
'(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:'符号是否有2个含义(符号列表)或这些是相同的数据类型并list实际返回引用的常量值?如果第二种情况是这样的话:

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

> (eval (list + (- 2 13) 11))
0
Run Code Online (Sandbox Code Playgroud)

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

但这不是:

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

> (eval '(#<procedure:+> -11 11))
. read: bad syntax `#<'
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*nzo 6

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

> (list 1 2 3 4)
(1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

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

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

  • "函数调用只是一个函数名列表,首先是它的参数吗?"几乎正确但不完全正确.在语言中,评估的是*form*,这是特殊列表,其中第一个参数是函数.你的第一个例子是有效的,因为"+"是函数的名称,`(list +( - 2 13)11)`的结果是列表`(<函数+> -11 11)`(每个参数`list`被评估).在你的第二个例子中,`(list 1 2 3 4)`的结果是列表`(1 2 3 4)`,它不是一个形式,因为`1`不是一个函数. (3认同)