Clojure - цитирование путаницы - PullRequest
7 голосов
/ 03 января 2012

Извините за ужасно смутное название:)

Я новичок в макросах, и мне трудно понять разницу между этими двумя утверждениями:

`(+ 1 2 ~(+ 2 3)) ; => (clojure.core/+ 1 2 5)
'(+ 1 2 ~(+ 2 3)) ; => (+ 1 2 (clojure.core/unquote (+ 2 3)))

Когда я запускаю их без кавычек, они кажутся довольно идентичными, кроме квалификации?

`(+ 1 2 (+ 2 3)) ; => (clojure.core/+ 1 2 (clojure.core/+ 2 3))
'(+ 1 2 (+ 2 3)) ; => (+ 1 2 (+ 2 3))

Так что в основном я смущен "против". Насколько я понимаю, они оба указывают все в списке, поэтому я не уверен, почему отмена цитирования ведет себя по-разному. По сути `ведет себя так, как я ожидал, и` и 'ведут себя.

Спасибо!

Ответы [ 2 ]

10 голосов
/ 03 января 2012

Короткий ответ таков: отмена цитирования работает только внутри обратной цитаты.В обычном выражении в кавычках все - включая ~ и все внутри / сзади - просто передается как есть, в то время как внутри выражения в кавычках все внутри / позади ~ оценивается (но все остальное остается неоцененным).Итак, нет, не все внутри выражения в кавычках остается неоцененным - вы можете использовать ~ внутри него, чтобы использовать его как своего рода шаблон, где вы «заполняете пробелы» с помощью ~.

Изменить: Цитировать (каламбур) документация , имеющая отношение к вашему вопросу:

Цитата:

Quote (')
'form => (quote form)

и (из специальных форм section):

(форма цитаты) Возвращает неоцененную форму.

user=> '(a b c)
(a b c)

Обратите внимание, что не было предпринято попытки вызвать функцию a.Возвращаемое значение представляет собой список из 3 символов.

Синтаксическая кавычка (также называемая квазицитой, обратной цитатой):

Для списков / векторов / наборов / карт, синтаксис-цитата устанавливает шаблон соответствующей структуры данных.В шаблоне неквалифицированные формы ведут себя так, как если бы они были рекурсивно цитированы синтаксисом, но формы могут быть освобождены от такого рекурсивного цитирования, квалифицируя их как unquote или unquote-splicing, и в этом случае они будут рассматриваться как выражения и заменяться в шаблоне ихзначение или последовательность значений соответственно.

4 голосов
/ 03 января 2012

Попробуйте запустить eval на результатах ваших первых двух выражений. Первый, с `," расширяется "до (+ 1 2 3), что приятно оценивается до 6. Второй, с '," расширяется "до (+ 1 2 (unquote (+ 1 2))), и кавычка недопустима в этом контексте, поскольку вы больше не внутри цитаты! Так что это вообще не в состоянии оценить.

По сути, есть два различия между 'и `:

  • `namespace-квалифицирует все
  • `позволяет отменить кавычки
...