Подтвердить что ты не робот

Использование цитаты в Clojure

Цитирование в clojure приводит к не-оценке. ':a и :a возвращают тот же результат. В чем разница между ": a и: a? Один не оценивается, а другой оценивает сам себя... но это то же самое, что и не оценка?

4b9b3361

Ответ 1

  • ':a является сокращением для (quote :a).

  • (eval '(quote form)) возвращает form по определению. То есть, если функция Clojure eval получает в качестве аргумента структуру списка, первый элемент которой является символом 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, структура данных ключевых слов строится во время чтения; то при оценке одной из этих форм структура данных возвращается без изменений - хотя по разным причинам.