Clojure резкая цитата? - PullRequest
       1

Clojure резкая цитата?

0 голосов
/ 12 февраля 2020

Мы знаем, что Clojure - это Lisp-1, то есть нет отдельных пространств имен функций и переменных.

Я расскажу об этом с точки зрения Common Lisp (который является Lisp-2).

Я пытаюсь понять метаданные, и меня смущает следующее:

user=> (def ^Integer my 3)
#'user/my
user=> (meta my)
nil
user=> (meta #'my)
{:tag java.lang.Integer, :line 1, :column 1, :file "NO_SOURCE_FILE", :name my, :ns #object[clojure.lang.Namespace 0x1d5a857d "user"]}

user=> (def myatom (atom (for [x [1 2 3]] ^{:key 'foo} x)))
#'user/myatom
user=> @myatom
(1 2 3)
user=> (first @myatom)
1
user=> (meta (first @myatom))
nil
user=> (meta #'(first @myatom))

RuntimeException EOF while reading, starting at line 1  clojure.lang.Util.runtimeException (Util.java:221)

RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:221)

Какова роль острой цитаты #' в Clojure?


Кроме того, что касается метаданных, меня немного смущает следующее:

Children: [:ul [:li] [:li] [:li] [:li]]
Keyed: [:ul [^3[:li] ^4[:li] ^5[:li] ^6[:li]]]

Это из главы, посвященной clojurescript / reagent в книге Professional Clojure. Является ли вторая строка обычным синтаксисом метаданных Clojure или он действителен только в результате макроса реагента?

Еще несколько экспериментов в ответе:

user=> ^1[2]
IllegalArgumentException Metadata must be Symbol,Keyword,String or Map  clojure.lang.LispReader$MetaReader.invoke (LispReader.java:798)
user=> ^:a[1]
[2][1]
user=> ^:a[1]
[1]
user=> (meta ^:a[1])
{:a true}
user=> 

Вторая строка там кажется странной , но, возможно, не обращайте внимания на это в первую очередь, если это не поможет.

1 Ответ

5 голосов
/ 12 февраля 2020

Использование точных кавычек, таких как #'my - это сокращение для записи (var my).

var возвращает объект Var, на который указывает символ my. Обратите внимание, что var является специальной формой Clojure и не ведет себя как обычный вызов функции.

Пожалуйста, ознакомьтесь с этим вопросом для получения полной информации о символах, переменных и значениях в Clojure: Когда использовать Var вместо функции?

См. также:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...