Поведение вложенных кавычек в Scheme и Racket

При написании функции в Racket я случайно поставил перед символом две одинарные кавычки вместо одной. т. е. я случайно написал ''a и обнаружил странное поведение вложенных кавычек. Я использую DrRacket и тестировал его как на языке Racket, так и на языке R5RS.

(write (pair? (quote (quote a))))

печатает: #t .

(write (car (quote (quote a))))

принты: цитата

Но

(write (quote (quote a)))

и

(write '(quote a)))

Оба печатают: 'a

Может кто-нибудь сказать мне, почему в Scheme (и Racket) функция пары? интерпретирует (quote (quote a))) как пару из двух элементов quote и a , но функция write выводит 'a вместо (quote a) .


person Harry Spier    schedule 02.11.2011    source источник


Ответы (1)


Помещение термина в кавычки (') и обтекание его формой quote идентичны. То есть они read в один и тот же срок.

Таким образом, все следующие выражения идентичны на схеме:

''a
'(quote a)
(quote 'a)
(quote (quote a))

Форма quote означает «интерпретировать то, что следует дальше, как данное — даже если оно содержит другое quote». Подтермин заключен в скобки, так что это список; внутренний quote — это просто символ.

В некоторых случаях принтер использует в выводе сокращения для чтения, такие как кавычки ('). Однако я немного удивлен, что вам удалось write сделать это; для меня он всегда пишет как (quote a).

person Ryan Culpepper    schedule 02.11.2011
comment
Я использовал DrRacket как с #lang r5rs, так и с #lang racket и выполнял (написать '(цитата a)) и (написать ''a) как в окне определений, так и в окне взаимодействия, и во всех случаях они печатали 'a . - person Harry Spier; 02.11.2011
comment
@HarrySpier, ага, вероятно, это связано с красивой печатью DrRacket. Если вы записываете его в другой порт, например строковый порт (см. open-output-string и т. д.), получается (quote a). - person Ryan Culpepper; 02.11.2011
comment
Спасибо, Райан. Сразу после того, как я задал вопрос, я нашел в Руководстве по рэкету 2.4.1 Цитирование пар и символов с кавычками. Аббревиатура работает как при выводе, так и при вводе. Принтер REPL распознает символ 'quote как первый элемент двухэлементного списка при печати вывода, и в этом случае он использует ' для печати вывода. - person Harry Spier; 03.11.2011
comment
Случайно в руководстве Racket я нашел особый случай, когда «а не означает» (квота а) . Если вы посмотрите: Racket Guide 15.1.3 Namespaces and Modules, там есть фрагмент кода для интерактивного окна DrRacket: тело модуля: › (module m ракетка/база (define x 11)) › (require 'm) › (define ns (module-›namespace ''m)) › (eval 'x ns) Внутренний ' указывает на его интерактивно объявленный путь к модулю, а второй ' делает его формой в кавычках. - person Harry Spier; 10.11.2011