Странный вывод после помещения «простого» идентификатора в Racket REPL - PullRequest
0 голосов
/ 28 сентября 2018

Сегодня я допустил опечатку в 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 голосов
/ 28 сентября 2018

См. Racketrivia: Использование ' в качестве «суффикса идентификатора» в списке рассылки ракеток.Ответ Робби Финдлера и ответ Маттиаса Феллайзена объясняют это.

Первая строка, 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
...