', (кавычка) в общем lisp - PullRequest
3 голосов
/ 24 февраля 2020

Каково влияние и использование ', в выражениях в кавычках в lisp? У него есть имя и оно где-то задокументировано? И насколько это распространено и полезно?

Например:

(defmacro test-exp (exp)
  `(format t "~&~S => ~S~%" ',exp ,exp))

Я предполагаю, что здесь потребуется буквально все, что есть exp во время расширения макроса, и заменить ',exp с этим. (В отличие от оценки exp и замены ,exp ею).

Ответы [ 2 ]

6 голосов
/ 24 февраля 2020

Вы угадали правильно.

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
3 голосов
/ 24 февраля 2020

', можно использовать только в выражениях в кавычках. Это два разных макроса читателя ' для цитирования и , для вычисления в s-выражениях в кавычках Запятая может появляться только в выражении в кавычках.

`(a ',(+ 1 2))

Выше указано то же, что и

`(a (QUOTE ,(+ 1 2)))

Поскольку ' является макросом для чтения для quote.

Таким образом, он имеет эффект, подобный следующему:

(list (quote a) (list (quote quote) (+ 1 2)))

, который оценивается как

(A (QUOTE 3))

Сравните

`(a ',(+ 1 2))

с оцененным результатом

(A (QUOTE 3))

Он в основном цитирует вычисленный результат (+ 1 2) и включает его в список.

...