Clojure 2024调查!中分享您的想法

欢迎!请参阅关于页面以了解更多有关此功能的信息。

0 投票
Clojure
我确信“内建的”可能不是正确的术语,但我不知道这些是什么。

今天早些时候,我在修复clojail的错误时遇到了这个问题。内建变量,尤其是以下列出的没有源链接的变量: http://clojure.github.com/clojure/clojure.core-api.html, 即使是动态的,也没有:dynamic元数据。这包括\*in\*, \*out\*, 和 \*err\*等。以下是一些示例


user=> (meta #'*err*)
{:ns #<Namespace clojure.core>, :name *err*, :added "1.0", :doc "A java.io.Writer object representing standard error for print operations.\n\n   Defaults to System/err, wrapped in a PrintWriter"}
user=> (meta #'*in*)
{:ns #<Namespace clojure.core>, :name *in*, :added "1.0", :doc "A java.io.Reader object representing standard input for read operations.\n\n   Defaults to System/in, wrapped in a LineNumberingPushbackReader"}
user=> (meta #'*out*)
{:ns #<Namespace clojure.core>, :name *out*, :added "1.0", :doc "A java.io.Writer object representing standard output for print operations.\n\n   Defaults to System/out, wrapped in an OutputStreamWriter", :tag java.io.Writer}
user=> (meta #'*ns*)
{:ns #<Namespace clojure.core>, :name *ns*, :added "1.0", :doc "A clojure.lang.Namespace object representing the current namespace.", :tag clojure.lang.Namespace}

5 答案

0 投票

评论由:[email protected] 发表

最近用户列表上的讨论似乎相关:(链接:http://groups.google.com/group/clojure/browse_thread/thread/d5efd00c699f73a7 文本:Should intern obey :dynamic?)

似乎可以归结为这样一个信息:Var是动态的还是静态的,这种信息是重复的。一次以键{{:dynamic}}的元数据形式,另一次作为实现Clojure变量的Var类的布尔字段。这个布尔值可以通过在Var上调用方法{{isDynamic()}}获得。

混淆产生的原因似乎是因为{{:dynamic}}和{{.isDynamic}}似乎可以失去同步。在这种情况下,{{.isDynamic}}是真理的源泉。

0 投票
评论者:[email protected]

{{Compiler$Parser.parse(...)}}在符号的元数据中找到由LispReader留下的{{:dynamic}}条目,并在创建新的{{DefExpr}}时将其传递,这又反过来生成在运行时创建变量时会调用{{setDynamic(...)}}的代码。

据我所知,{{:dynamic}}在发生之后似乎就不再相关了。它看起来只是作为与编译器通信(通过读取器)的一种方式。编译器收到消息后,就不再需要了。保留它似乎只会造成困惑。

Clojure核心Java层创建的动态变量不使用{{:dynamic}}机制,它们直接{{setDynamic()}}。这就是为什么它们在元数据映射中不包含{{:dynamic}}的原因。

- 可能编译器应该省略运行时元数据映射中的{{:dynamic}},因为它已经完成了它的作用。
- 可能Clojure应该提供{{dynamic?}}函数。
(defn dynamic? [^clojure.lang.Var v] (.isDynamic v))

或者,考虑到1.4版本,也许完全取代{{:dynamic}},并仅仅强制执行已建立的命名约定:{{\*earmuffs\*}}是动态的,{{其余部分}}不是。(编译在1.3版本中警告违反此约定。)
0 投票

评论者:jafingerhut

我最近在core.clj中注意到几行类似这样的代码。根据类似符号的数量,可能这种方法可以用来给核心中的符号添加:dynamic元数据,以及一个单元测试来验证所有符号在核心中只有当.isDynamic返回true时存在:dynamic。

0 投票

评论者:jafingerhut

呃。在我之前的评论中,当我提到“这样的几行”时,意思是要粘贴以下内容作为示例

(alter-meta! #'agent assoc :added "1.0")

0 投票
引用:https://clojure.atlassian.net/browse/CLJ-859(由alex+import报告)
...