Цитирование в 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, структура данных ключевых слов строится во время чтения; то при оценке одной из этих форм структура данных возвращается без изменений - хотя по разным причинам.