Цитата отображается в выводе при добавлении с помощью fold-left в схеме

Я пытаюсь объединить списки в схеме, используя fold-left и append (для использования в более крупной функции). Тем не менее, я продолжаю получать результаты, которые выглядят так:

=> (0 quote (1) quote (2))

Это мой код:

(fold-left (lambda(a b) (append a b)) '(0) '('(1) '(2)))

Почему это не работает точно так же, как:

(define x (append '(0) '(1)))
(define y (append x '(2)))
y

Этот код выводит простой список:

(0 1 2)

Разве fold-left не делает то же самое, что и второй блок кода? Что я могу изменить, чтобы получить простой вывод списка?


person 16jacobj    schedule 15.09.2018    source источник
comment
Возможный дубликат В чем разница между цитатой и списком?   -  person Alexis King    schedule 16.09.2018


Ответы (1)


Вы цитируете внутри цитируемых данных. Когда Scheme встречает (quote x) или для краткости 'x, она оценивает его как аргумент без изменений..

'('(1) '(2)))

Является сокращением от:

(quote ((quote (1)) (quote (2))))

И, согласно моим установленным правилам оценки, он должен оцениваться как:

((quote (1)) (quote (2)))

Таким образом, если вы возьмете caar или это выражение в кавычках, вы должны получить символ quote:

(caar '('(1) '(2)))
; ==> quote

Если вы не планировали использовать эти кавычки в структуре данных, вам не нужно их использовать в выражении, например:

'((1) (2))

Примечание: существует язык, связанный со Scheme, который называется Racket. Его вывод по умолчанию в их REPL — это не само значение, а выражение, которое будет оцениваться как это значение. Это обычно сбивает с толку даже опытных интриганов. Это как спросить кого-то "сколько будет 3 плюс 4" и ответить 1 plus 6.

person Sylwester    schedule 15.09.2018
comment
Спасибо за прекрасное объяснение. Это одна из самых запутанных тем схемы для меня. - person 16jacobj; 16.09.2018