Немного смущают минусы, определенные на схеме

ответ получить ответ:

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

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

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

Но мне интересно, почему нет:

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

минусы определяют добавление первого аргумента в первый из второго аргумента. второй аргумент представляет собой список.

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

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

почему нет : (cons 'quote'(a)) ---> (quote (a)) --> (a)


person jiamo    schedule 17.11.2013    source источник


Ответы (1)


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

  1. (cons 'quote '(a)) conses together the datums quote and (a), resulting in the datum (quote . (a)), which is the same as the datum (quote a) (that is, a list containing two symbols, quote and a).
    • Remember, for a list like (foo bar baz), it's the same as (foo . (bar baz)), (foo . (bar . (baz))), etc. So (quote a) is really the same as (quote . (a)).
  2. Поскольку 'a является сокращением для чтения для (quote a), автор вашей реализации решил распечатать его как 'a, а не (quote a). Но оба правильны.

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

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

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

person Chris Jester-Young    schedule 17.11.2013
comment
Кажется, что вы используете drracket, разные языки показывают разные. - person jiamo; 17.11.2013
comment
По умолчанию DrRacket отображает результаты как evalпригодные данные, поэтому для (cons 'quote '(a)) это напечатал бы это как ''a. Фактическое значение по-прежнему 'a, но, напечатав его как ''a, вы можете скопировать его в REPL и получить ожидаемый результат. - person Chris Jester-Young; 17.11.2013
comment
ИСПОЛЬЗУЙТЕ язык R5RS в REPL, просто напечатайте - person jiamo; 17.11.2013
comment
Это неправда. Когда я тестировал с plt-r5rs, он распечатывался как (quote a). А с DrRacket в режиме #lang r5rs он распечатал (mcons 'quote (mcons 'a ())). - person Chris Jester-Young; 17.11.2013
comment
Схема MIT: (define xx (cons 'quote '(a))) ;Value: xx, xx ;Value 18: (quote a), (map symbol? xx) ;Value 19: (#t #t), (map symbol->string xx) ;Value 20: ("quote" "a"). Использование S-выражений в качестве М-выражений имеет свои недостатки, заставляет вас много говорить о данных. :) - person Will Ness; 17.11.2013
comment
@yanxinyou Вы имеете в виду, что когда вы выбираете R5RS из выпадающего меню в DrRacket, REPL ведет себя по-другому, например (cons 'quote '(a)) ==> 'a? Это правильно, так как он имеет другие настройки, чем язык модуля #!r5rs (== #lang r5rs). - person Sylwester; 18.11.2013
comment
@Сильвестр. Так как #!racket (quote a) --› 'a , #!r5rs (quote a) --› a . Так что, похоже, r5rs оценивает аргумент. #!racket(eval'(quote a)) ---› 'a . в то время как #r5rs (eval '(quote a)) ----› с неправильным числом аргументов eval . Таким образом, #r5rs был реализован с помощью рэкета, или exp был передан на рэкетный язык. И этот проход будет оценивать arg как arg в racket . Мне нужно посмотреть документацию о ракетке. Пока я изучаю The Litter Schemer, есть предложения? - person jiamo; 19.11.2013
comment
@yanxinyou Это просто презентация .. например, вы можете написать 17 как 0x11. Вы оцениваете 'a. Если вы получаете просто a, то он отображается как данные. Если это «а», вы должны игнорировать цитату, так как это значение, которое может быть оценено рэкетом. Оба работают просто отлично, когда вы знаете. - person Sylwester; 20.11.2013