Clojure - разница между цитатой и цитатой синтаксиса

(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)

Может кто-нибудь объяснить, как это оценивается шаг за шагом?

Ответ 1

Оператор с одной кавычкой возвращает выражение или символ, который вы цитируете, не оценивая его. Оператор синтаксиса-кавычки возвращает выражение или символ, который вы цитируете (с добавленными пространствами имен), не оценивая его. Оператор синтаксиса-unquote "отменяет" оператор синтаксиса-котировки, так сказать, но не одинарной кавычки. Вы можете вставлять синтаксические кавычки и синтаксис-unquotes, чтобы выполнять странные и замечательные подвиги. Моя любимая аналогия, которую я прочитал для понимания, это рассмотреть синтаксический цитирование и синтаксис-unquoting как перемещение вверх и вниз по лестницам (возможный источник).

В форме `x, x цитируется синтаксис, поэтому он не оценивается; вместо этого вы получаете символ с именами (например, user/x). Но в форме `~x, x снова синтаксически не кавыдается, поэтому он оценивается:

user=> `~x
1

На примерах:

Пример 1

' - это просто сахар для (quote ...).

Итак, '`~x становится (quote `~x). Это, в свою очередь, становится (quote x) (помните, что `~ на самом деле ничего не делает), поэтому все выражение оценивается символом x.

Пример 2

В `'~x, сначала заменим ' на quote: `(quote ~x). Выражение синтаксически цитируется, поэтому оно не будет оцениваться.

Итак, вы можете представить выражение (quote ~x) как "промежуточный шаг". Но мы не закончили. x внутри синтаксиса-цитаты синтаксис-без кавычек, как и в моем примере выше. Поэтому, хотя это выражение в целом не будет оцениваться, x будет, а его значение равно 1. В конце вы получите выражение: (quote 1).

Сообщение в блоге по теме.