Какой смысл в кавычках с одним аргументом и запятой? (цитата, аргумент)
15
(quote x)делает x не оцененным, но добавление ,перед xвнутри quoteделает его оцененным. В чем тогда смысл использовать цитату с одним аргументом с запятой перед ним, как так: (quote ,x)?
Запятая используется в контексте закавыченных (ака quasiquoted) список, который позволяет оценить некоторые части списка выборочно. Смотрите также эту ветку для примера использования для обратного цитирования.
Пара простых примеров:
(setq a "a's value" b "b's value" c "c's value")
'(a b c) ; => (a b c)
`(,a b ,c) ; => ("a's value" b "c's value")
Итак, цитата перед значком prognозначает, что вы должны поставить запятую перед тем, что вы хотите оценить, независимо от того, насколько далеко оно вложено? (Это ,cmdв другом списке, а не непосредственно в нем (progn).)
Несовершеннолетний кот
Это похоже на хорошую возможность проверить это! Попробуйте оценить, (setq a "a's value" b "b's value" c "c's value")а затем оценить `(a '(,b c)).
Дан
Другие новинки: чтобы оценить, добавьте текст в рабочий буфер, поместите курсор в конец строки и нажмите Cxe.
Несчастный кот
11
Это потому, что это внутри макроса. Макрос должен возвращать форму Lisp, которая затем оценивается.
progn
означает, что вы должны поставить запятую перед тем, что вы хотите оценить, независимо от того, насколько далеко оно вложено? (Это,cmd
в другом списке, а не непосредственно в нем(progn)
.)(setq a "a's value" b "b's value" c "c's value")
а затем оценить`(a '(,b c))
.Это потому, что это внутри макроса. Макрос должен возвращать форму Lisp, которая затем оценивается.
Например, глядя на первый вызов этого макроса:
Нам нужно расширение, чтобы содержать:
чего и
(quote ,cmd)
добивается. Если бы макрос использовалcmd
взамен простой , он был бы сохранен буквально, и расширение было бы:что является ошибкой, потому что
cmd
не определено в среде, где вызывается макрос.источник