Что означает обратный удар в LISP?
У меня есть этот макрос, который переписывает определение. Если я уберу знак " ` ", он не будет работать. Какое объяснение?
(defmacro define ((name &rest r) body)
`(defun ,name ,r ,body))
2 ответа
Одиночная кавычка, за которой следует письменное представление значения, создаст это значение:
Пример:
'(1 x "foo") выдаст значение, которое печатается как (1 x "foo")
,
Предположим теперь, что я не хочу буквальный символ x
в списке. У меня есть переменная x
в моей программе, и я хочу вставить значение, к которому x
,
Чтобы отметить, что я хочу значение x
а не символ x
Я вставляю запятую перед x
:
'(1 ,x "foo")
Это не будет работать как есть - теперь я получаю значение, которое имеет буквальную запятую, а также символ x
, Проблема в том, что quote
не знает о соглашении запятых.
Backtick или backquote
знает о соглашении с запятыми, что даст правильный результат:
> `(1 ,x "foo")
(1 3 "foo") ; if the value of x is 3
Подробнее читайте здесь: http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm
Обратный кавычк / обратная кавычка отключает оценку для каждого подвыражения, которому не предшествует запятая для списка, следующего за оператором.
Из общей кулинарной книги, пояснения и несколько примеров.