2013-11-17 2 views
0

в РЕПЛ получить ответ:Немного запутался о недостатках, определенных в схеме

> (cons 'quote '(a)) 
'a 

здесь я думаю, как он получил правильный ответ:

(«цитата» минусы (а)) --- > (цитата 'а) --->' а

Но я удивляюсь, почему это не так:

('цитата' минусы (а)) ---> (цитировать) ---> а

cons cons добавляет первый arg в первый из вторых аргументов. второй arg - это список.

Я тоже не понимаю, почему это не может быть объяснено следующим образом:

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

почему не: ('цитата' минусы (а)) ---> (цитата (а)) -> (a)

ответ

2

Таким образом, результатом (cons 'quote '(a)) является (quote a) (исходное значение, а не выражение кода). Следовательно, результат 'a верен. Для того, чтобы уточнить:

  1. (cons 'quote '(a)) conses вместе датумов quote и (a), что приводит к нулевой точке (quote . (a)), которая является такой же, как точки привязки (quote a) (то есть, список, содержащий два символа, и quotea).
    • Помните, что для списка, как (foo bar baz), это то же самое, как (foo . (bar baz)), (foo . (bar . (baz))) и т.д. Так (quote a) действительно так же, как (quote . (a)).
  2. Поскольку 'a является читатель стенографией для (quote a), автор вашей реализации выбрал распечатать его в качестве 'a, а не (quote a). Но оба правильны.

Но в вашем посте, вы упомянули ваши ожидания:

('цитата' минусы (а)) ---> (цитировать) ---> а

Первая часть этого правильная. (cons 'quote '(a)) делает оценку (quote a). Но теперь это точка отсчета, а не выражение кода, поэтому она не будет снова оцениваться. Поэтому он не станет a, если вы явно не назовете на него eval.

+0

Похоже, использование дрейфа на разных языках показывает разные. – jiamo

+1

[По умолчанию] (http://docs.racket-lang.org/reference/printing.html), DrRacket отображает результаты как 'eval'able datum, поэтому для' (cons 'quote' (a)) ', он напечатает это как '' 'a'. Фактическое значение все еще '' a', но, напечатав его как '' 'a', вы можете скопировать его в REPL и получить ожидаемый результат. –

+0

ИСПОЛЬЗУЙТЕ lang R5RS в REPL, просто напечатайте – jiamo

Смежные вопросы