在球拍REPL中的标识符上加上“素数”后,输出奇怪

时间:2018-09-28 12:44:16

标签: racket

今天,我在REPL中犯了一个打字错误,发现了一个奇怪的行为。这是互动的示例:

Welcome to Racket v6.11.
> (define x 3)
> x
3
> x'
3
> x
'x
> 

因此,我键入的第一个x产生了3,这是预期的。我不小心输入的x'导致3,这是意外的。最后一个x产生'x(!!)。

似乎我对REPL如何读取值有些不了解。有人可以解释为什么REPL会如此行为吗?

1 个答案:

答案 0 :(得分:2)

请参阅球拍邮件列表上的Racketrivia: Using ' as an "identifier suffix"reply by Robby Findlerreply by Matthias Felleisen都对此进行了解释。

第一行x,很正常。

第二行x'实际上是“表达式和一半”。它被解释为表达式x,后跟未完成表达式'。未完成的表达式允许在下一行完成。无论您在下一行加上什么内容,都将作为' next-line的后半部分。

这意味着第三个x实际上被解释为' x的后一半。

您可以看到带有括号的未完成表达式的更好示例:

> 1 (list 2     ; 1 followed by an unfinished expression
1
> 3 4)          ; finishing it
'(2 3 4)
> 3 4)          ; on its own without the `(list 2` before it it's an error
3
4
; readline-input:13:3: read-syntax: unexpected `)` [,bt for context]

用类似的方式解释表达式后的引号:

> 1 '                            ; 1 followed by an unfinished expression
1
> (indefatigable inexhaustible)  ; finishes previously unfinished, put after a quote
'(indefatigable inexhaustible)
> (indefatigable inexhaustible)  ; on its own without the quote before it it's an error
; indefatigable: undefined;
;  cannot reference an identifier before its definition
;   in module: top-level
;   internal name: indefatigable