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).