(def x 1)
user=> '`~x
x
user=> `'~x
(quote 1)
Может кто-нибудь объяснить, как это оценивается шаг за шагом?
(def x 1)
user=> '`~x
x
user=> `'~x
(quote 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)
.
Сообщение в блоге по теме.