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

欢迎!请参阅关于 页面以了解如何工作的更多信息。

+9
语法和读取器

Clojure的持久队列结构已经在语言中存在一段时间了,并且已经进入到相当数量的代码库中。然而,创建队列是一个两步操作,通常形式为

`
(conj clojure.lang.PersistentQueue/EMPTY :a :b :c)

;=> #
`

可能更好的体验如下

`

queue [:a :b :c]

;=> #queue [:a :b :c]

(pop #queue [:a :b :c])

;=> #queue [:b :c]
`

该语法已在https://groups.google.com/forum/?fromgroups#!topic/clojure-dev/GQqus5Wycno 的Clojure-dev小组中提出和讨论。

开放性问题:队列字面量的参数应该评估吗?这会带来的影响如下所示

`
;; 非评估情况

queue [1 2 (+ 1 2)]

;=> #queue [1 2 (+ 1 2)]

;; 评估情况

queue [1 2 (+ 1 2)]

;=> #queue [1 2 3]
`

此开放问题的答案将决定实现方式。

20 答案

0

评论由:[email protected] 添加

我认为非评估行为将与Clojure 1.4中其他读取器文字保持一致。这肯定对互操作性更好,其中一些其他语言的实现可能能够处理一些字面量表示,但不能评估Clojure表达式。如果参数需要评估,请使用常规函数。

0
_评论由:cemerick_ 发表

记录的前置似乎相关


=> (defrecord A [b])
user.A
=> #user.A[(+ 4 5)]
#user.A{:b (+ 4 5)}
=> #user.A{:b (+ 4 5)}
#user.A{:b (+ 4 5)}


这一点继续有意义,否则队列需要打印时在列表周围额外打印一个 {{(quote …)}} 形式 — 而记录则巧妙地避开了这种形式


=> (A. '(+ 4 5))
#user.A{:b (+ 4 5)}


这是否意味着将出现一个类似于 {{vector}} 的 {{queue}} 函数? 这将方便在函数式编程中(HOF)使用。
0

评论由:fogus 发表

只添加了对标记字面量支持的补丁。这只是整体解决方案的一部分。这提供了读取字符串和打印功能。在深入研究编译器之前,我希望更多关于 eval 方面的讨论。

0

评论由:pmbauer 发表

除了 Chas 对记录字面量一致性的观察外,队列字面量中的 eval 是否会像 #= 一样打开相同的 security hole,需要尊重 read-eval
在队列字面量内部需要 eval 时,嵌入一个 #= 似乎更为合适。

0

评论由:fogus 发表

支持 eval 的队列字面量。

0

评论由:jafingerhut 发表

2012 年 4 月 27 日的 CLJ-976-queue-literal-tagged-parse-support-only.diff 和 2012 年 5 月 4 日的 CLJ-976-queue-literal-eval.diff 补丁都没有成功地应用到 2012 年 5 月 10 日的最新 master 上。

0

评论由:fogus 发表

已更新补丁文件以合并最新的master版本。

0

评论由:fogus 发表

具有语法引用支持的补丁更新。

0

评论者:stuart.sierra

自提交 f5f4faf95051f794c9bfa0315e4457b600c84cef 以来,补丁没有应用。

0

评论由:fogus 发表

奇怪。我刚刚能够下载 CLJ-976-queue-literal-eval-and-synquote.diff 补丁,并将其应用到最新的 HEAD 版本(f5f4faf95051f794c9bfa0315e4457b600c84cef)。有一些空白警告,但补丁已应用,编译并通过所有测试。

0

评论由:jafingerhut 发表

使用最新HEAD,我能够成功应用补丁 CLJ-976-queue-literal-eval-and-synquote.diff,使用以下命令

git am --keep-cr -s < CLJ-976-queue-literal-eval-and-synquote.diff

有一些警告,但是成功应用了。如果我不使用 --keep-cr 选项,补丁将无法应用。我相信这通常是以下任一文件或补丁包含 CR/LF 行结束符号的迹象,Clojure 源文件的确有一些。

上面的命令(带有 --keep-cr)是当前在 http://dev.clojure.org/display/design/JIRA workflow 页面的“Screening Tickets”部分推荐用于应用补丁的命令。我在遇到另一个带有该选项但未带该选项的应用补丁之后添加了建议的 --keep-cr 选项。

0

评论由:jafingerhut 发表

因最新补丁使用 --keep-cr 选项可以干净地应用,故擅自将审批状态从“不完整”改回“测试”。

0
by

评论者:richhickey

这需要更多时间

0
by

评论由:fogus 发表

Rich,

你介意提供一些更多细节吗?如果有需要,我会很高兴做出任何修改。然而,如果这只是关于它与 EDN 的关系或者要等到下一个版本,我也愿意等待。无论哪种情况,我都希望完成这项工作或者将其放在我脑后。谢谢。

0
by

评论由:jafingerhut 发表

2012年10月5日发布的clj-976-queue-literal-eval-and-synquote-patch-v2.txt与Fogus于2012年7月20日发布的CLJ-976-queue-literal-eval-and-synquote.diff是相同的。它只是从clojure.iml中删除了一行Rich在此后不同提交中已添加的内容,因此此补丁现在可以干净地应用到最新master版本。

...