Racket 中的 '(撇号)是什么?
What is ' (apostrophe) in Racket?
我对球拍中'
签到的含义有点困惑。在我看来,同一个符号有不同的含义。请看下面的 2 个简单示例:
Returns a newly allocated list containing the vs as its elements.
> (list 1 2 3 4)
'(1 2 3 4)
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
实际上 returns 一个 引用的常量值 ?如果是第二种情况,为什么会这样:
> '(+ (- 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?
您对 #lang racket
打印值的默认方式感到困惑,这与几乎所有其他交互式 lisp 环境不同。如果您在 DrRacket 本身中选择另一种语言,例如 R5RS,您会发现它打印:
> (list 1 2 3 4)
(1 2 3 4)
即运算符 list
应用于数字1 2 3 4的结果是产生这些数字的列表,这正是解释(1 2 3 4)
.
所以,答案是
What is ' (apostrophe) in Lisp / Scheme? 也适用于您的情况,'anything
只是 (quote anything)
.
的缩写
>
是 REPL 的标志 - Read-Eval-Print Loop。
首先,您在 REPL 提示符下键入的任何表达式都是 read - 转换为某种内部抽象语法树表示。然后这个输入表达式的内部表示是 evaluated - 即找到它的值。然后打印结果。
当我们打字时
> (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
的评估规则),returns 它收到的 data。我们表示为
[1 | [2 | [3 | [4 | NIL ]]]]
这就是两者相似的原因。我们是否构建一个包含 1、2、3 和 4 的新列表;或者我们让它作为 read 过程的一部分创建,所以它会被 quote
逐字返回;结果是一样的。
我对球拍中'
签到的含义有点困惑。在我看来,同一个符号有不同的含义。请看下面的 2 个简单示例:
Returns a newly allocated list containing the vs as its elements.
> (list 1 2 3 4)
'(1 2 3 4)
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
实际上 returns 一个 引用的常量值 ?如果是第二种情况,为什么会这样:
> '(+ (- 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?
您对 #lang racket
打印值的默认方式感到困惑,这与几乎所有其他交互式 lisp 环境不同。如果您在 DrRacket 本身中选择另一种语言,例如 R5RS,您会发现它打印:
> (list 1 2 3 4)
(1 2 3 4)
即运算符 list
应用于数字1 2 3 4的结果是产生这些数字的列表,这正是解释(1 2 3 4)
.
所以,答案是
What is ' (apostrophe) in Lisp / Scheme? 也适用于您的情况,'anything
只是 (quote anything)
.
>
是 REPL 的标志 - Read-Eval-Print Loop。
首先,您在 REPL 提示符下键入的任何表达式都是 read - 转换为某种内部抽象语法树表示。然后这个输入表达式的内部表示是 evaluated - 即找到它的值。然后打印结果。
当我们打字时
> (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
的评估规则),returns 它收到的 data。我们表示为
[1 | [2 | [3 | [4 | NIL ]]]]
这就是两者相似的原因。我们是否构建一个包含 1、2、3 和 4 的新列表;或者我们让它作为 read 过程的一部分创建,所以它会被 quote
逐字返回;结果是一样的。