今天,我在REPL中犯了一个打字错误,发现了一个奇怪的行为。这是互动的示例:
Welcome to Racket v6.11.
> (define x 3)
> x
3
> x'
3
> x
'x
>
因此,我键入的第一个x
产生了3
,这是预期的。我不小心输入的x'
导致3
,这是意外的。最后一个x
产生'x
(!!)。
似乎我对REPL如何读取值有些不了解。有人可以解释为什么REPL会如此行为吗?
答案 0 :(得分:2)
请参阅球拍邮件列表上的Racketrivia: Using '
as an "identifier suffix"。 reply by Robby Findler和reply 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