Цитирование в clojure приводит к не-оценке. ':a
и :a
возвращают тот же результат. В чем разница между ": a и: a? Один не оценивается, а другой оценивает сам себя... но это то же самое, что и не оценка?
Использование цитаты в Clojure
Ответ 1
-
':a
является сокращением для(quote :a)
. -
(eval '(quote form))
возвращаетform
по определению. То есть, если функция Clojureeval
получает в качестве аргумента структуру списка, первый элемент которой является символомquote
, он возвращает второй элемент указанной структуры списка без какого-либо преобразования (таким образом, это сказал, что цитируемая форма не оценивается). Другими словами, поведениеeval
отправляется, когда его аргумент представляет собой структуру списка формы(quote foo)
, является тем, что возвращаетfoo
без изменений, независимо от того, что это. -
Когда вы записываете литерал
:a
в своей программе, он считывается как ключевое слово:a
; то есть конкретный фрагмент текста:a
преобразуется в структуру данных в памяти, которая, как считается, называется ключевым словом:a
(Lisp, являющимся гомоиконическим, означает, что иногда трудно отличить текстовое представление Lisp данные и сами данные, даже если это было бы полезно для пояснительных целей...). -
Структура данных в памяти, соответствующая литералу
:a
, представляет собой объект Java, который предоставляет множество методов и т.д. и обладает интересным свойством, что функцияeval
, когда она получает этот объект данных как аргумент, возвращает его без изменений. Другими словами, ключевое слово "оценка для себя", о котором вы спрашиваете, это просто поведениеeval
отправляется при передаче в ключевое слово как аргумент. -
Таким образом, когда
eval
видит':a
, он обрабатывает его как цитированную форму и возвращает вторую ее часть, которая оказывается:a
. Когда, с другой стороны,eval
видит:a
, он рассматривает его как ключевое слово и возвращает его без изменений. Возвращаемое значение в обоих случаях одинаково (это просто ключевое слово:a
); процесс оценки несколько отличается. -
Clojure семантика - действительно Lisp семантика для любого диалекта Lisp - указана в терминах возвращаемых значений и побочных эффектов, вызванных функцией
eval
, когда она получает различные структуры данных Lisp в качестве аргументов. Таким образом, приведенное выше объясняет, что на самом деле должно было произойти, когда вы записываете':a
или:a
в свою программу (код типа(println :a)
может быть скомпилирован в эффективный байт-код, который фактически не кодирует функциюeval
, конечно; но семантика всегда сохраняется, так что она все еще действует так, как будто онаeval
получает структуру списка, содержащую символprintln
и ключевое слово:a
). -
Основная идея здесь заключается в том, что независимо от того, является ли оцениваемая форма
':a
или:a
, структура данных ключевых слов строится во время чтения; то при оценке одной из этих форм структура данных возвращается без изменений - хотя по разным причинам.