Вы угадали правильно.
quote
Специальный оператор quote
определяет выражение, которое оценивает его подчиненную форму, буквально. Например:
(quote (looks like a function call))
Внутренняя форма выглядит как вызов функции, но для читателя Lisp это просто список символов. Выражение (quote ...)
оценивает этот список, не пытаясь оценить список как код.
Существует специальный синтаксис для выражения в кавычках, символ кавычки, так что 'exp
совпадает с (quote exp)
. Обычно вы пишете символы, когда не хотите их оценивать.
обратная кавычка / запятая
Квазиквотация - это способ указать только часть выражения.
backtick действует как кавычка: данные внутри него не оцениваются, за исключением случаев, когда они начинаются с префикса через запятую, и в этом случае оценка переключается обратно. Можно написать следующее выражение
`(format t "~s" ,exp)
...:
(list 'format 't '"~s" exp)
Я добавил к литералам кавычки, которые в противном случае были бы самооценочными, для полноты, но на практике вы написали бы этот же список выглядит следующим образом:
(list 'format t "~s" exp)
Здесь exp
оценивается, и вся форма дает список, который напоминает вызов format
, где env
заменяется на любое значение.
кавычка
Комбинация кавычка / запятая, которую вы видите в примере, является распространенной идиомой, где вы хотите поместить аргумент, заданный во время макроразложения (то есть код), буквально в расширяемый код, без оценки. Если вы тестируете свой макрос, расширяя его макросом, вы можете увидеть полученный код:
(macroexpand '(test-exp (+ 5 8)))
=> (FORMAT T "~&~S => ~S~%" '(+ 5 8) (+ 5 8))
Литеральная форма (+ 5 8)
помещается в форму (quote ...)
, что делает ее неоцененной во время выполнения. Между тем, то же выражение ставится как есть рядом с ним, таким образом оценивая его во время выполнения. Если вы вычислите полученное выражение, оно напечатает:
(+ 5 8) => 13