我对 Racket 中 '
标志的含义有点困惑。在我看来,同一个符号有不同的含义。看下面两个简单的例子:
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
实际上返回一个带引号的常量值?如果是第二种情况,为什么这样做:> '(+ (- 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?
最佳答案
>
是 REPL - Read-Eval-Print Loop 的标志。
首先,读取您在 REPL 提示符下键入的任何表达式 - 转换为某些内部抽象语法树表示。然后计算输入表达式的这种内部表示 - 即找到它的值。然后打印结果。
当我们打字
> (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 的新列表;或者我们让它作为读取过程的一部分被创建,所以它会被
quote
逐字返回;结果是一样的。
关于functional-programming - Racket 中的 '(撇号)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33779637/