请在2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请访问关于页面以获取有关如何操作的一些更多信息。

+9
语法和 reader

Clojure 的 PersistentQueue 结构现在已在语言中存在一段时间,并已进入许多程序代码库。然而,队列的创建通常是两步操作,形式如下

`
(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 中的其他 reader 字面量保持一致。对于互操作性,这尤其是在其他语言实现可能期望处理一些字面量表示但不会评估 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)}


这个意思依然成立,否则队列需要打印时在列表周围额外使用 {{(引号 ...)}} 形式,而这类记录可以很好的避免


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


这意味着一个 {{队列}} fn(类似于 {{向量}},可能)也会出现吗?这对于 HOF 用法将非常方便。
0

评论者:fogus

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

0

评论者:pmbauer

除了对记录字面量一致性方面的观察之外,队列字面量中的 eval 是否会像 #= 一样打开同样的安全漏洞,需要尊重 read-eval
当需要在队列字面量中嵌入 eval 时,使用 #= 看起来更合适。

0

评论者:fogus

可 eval 的队列字面量支持。

0

评论者:jafingerhut

截至 2012 年 5 月 10 日的最新 master 版本中,补丁 CLJ-976-queue-literal-tagged-parse-support-only.diff (2012 年 4 月 27 日) 和 CLJ-976-queue-literal-eval.diff (2012 年 5 月 4 日) 均无法干净地应用。

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

评论由:richhickey 提出

这需要更多时间

0

评论者:fogus

Rich,

您能否提供更多细节?如有需要,我将很高兴进行任何修改。然而,如果这与EDN的关系或者等待下一个版本有关,那么我也乐于等待。在任意一种情况下,我都希望完成这项工作或者将它放在我的幕后。谢谢。

0
by

评论者:jafingerhut

clj-976-queue-literal-eval-and-synquote-patch-v2.txt(文件日期为2012年10月5日)与Fogus的补丁CLJ-976-queue-literal-eval-and-synquote.diff(文件日期为2012年7月20日)完全相同。它只是移除了一条 Rich 在不同的提交中添加到 clojure.iml 的添加行,因此这个补丁现在可以干净地应用于最新主分支。

...