поведение котировки в рэкет

Я привык к тому, что (quote x) оценивается как x, (quote (x y z)) оценивается как (x y z), а (car (quote (x y z)) оценивается как x. Рассуждение простое: цитата — это особая форма, которая не вычисляет свой аргумент, а просто возвращает его как есть.

Я только начал использовать Racket, и он считает, что (quote x) оценивается как (quote x), (quote (x y z)) оценивается как (quote (x y z)), а (car (quote (x y z)) оценивается как (quote x).

Ну, на самом деле, он печатает их как 'x, '(x y z) и 'x соответственно, но это одно и то же.

Может ли кто-нибудь объяснить аргументацию здесь? Если по какой-то причине (quote (x y z)) оценивается как (quote (x y z)), не должна ли машина этого автомобиля быть quote? Откуда (quote x)?

Насколько я могу судить, Racket на протяжении всего вычисления внутренне ведет себя так же, как я привык, за исключением того, что когда приходит время печатать окончательный результат, он оборачивает его в форму цитаты. Во всех ли случаях это правильно? И если да, то зачем ему это делать?


person user3327311    schedule 19.02.2014    source источник
comment
См. мое примечание в этом ответе: в качестве дополнительного осложнения некоторые системы (я имею в виду некоторые языки, доктор Рэкет , в частности) не печатать значение формы в интерактивной подсказке, а печатать форму, которая будет давать те же (для некоторых интерпретаций «тех же») значения. Например, вы можете оценить '(1 . 2) и увидеть вывод (cons 1 2), потому что это другая форма, которая даст то же значение.   -  person Joshua Taylor    schedule 19.02.2014
comment
возможный дубликат значения 'quote в Lisp   -  person Joshua Taylor    schedule 19.02.2014


Ответы (2)


Racket оценивает выражения так же, как и любая схема. Однако у Racket есть специальный писатель на языках обучения. В DrRacket вы можете изменить способ печати значений. В языковом меню нажмите кнопку «Дополнительно», а затем взгляните на параметры печати.

person soegaard    schedule 19.02.2014

Racket (язык) выводит результат форм верхнего уровня не только при вводе в окно взаимодействия (REPL), а всегда. Я думаю, это упрощает разработку, и в реальных приложениях у вас нет операторов, которые ничего не означают, поэтому в реальном приложении эти строки не будут отображаться, поскольку у вас есть define и выражение для запуска вашей программы, и вы можете вернуться (void) из него, чтобы принудительно не выводить..

Если бы вы изменили язык либо на #!r6rs, либо на #!r5rs, вы быстро увидите, что единственный способ получить результат оценки в окне определений — это явно использовать display для результата.

Независимо от используемого языка display отображает его правильно. Для REPL-print язык и настройки управляют тем, как он отображается. Стандартный #!racket должен отображаться таким образом, что помещение его в новое выражение, обернутое с помощью display, будет печатать точно так же, как если бы вы обернули исходное выражение с помощью display.

(define test 'hello-world)
(display test) ;; displays hello-world and not 'hello-world
test           ;; displays 'hello-world in #!racket, nothing in R6RS unless in interactions window
person Sylwester    schedule 20.02.2014