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

欢迎!请查看关于页面以了解有关此内容的一些更多信息。

+9
语法和读取器

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中的其他读取器常量保持一致。它肯定更适合与其他语言实现协操作,其中可能期望处理几个字面表示,但不执行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)}


这意思是说,一个 queue 函数(类似于 vector)也将出现吗?这会很方便用于 HOF(高阶函数)的使用。
0
by

由:fogus_ 添加的注释

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

0
by

由:pmbauer_ 添加的注释

除了 Chas 对记录字面量一致性的观察之外,队列字面量中的 eval 是否会打开与 #= 相同的安全漏洞,需要尊重 read-eval 吗?
当在队列字面量中需要 eval 时,内嵌 #= 看起来更为恰当。

0
by

由:fogus_ 添加的注释

Evalable 队列字面量支持。

0
by

由:jafingerhut_ 添加的注释

两个补丁(CLJ-976-queue-literal-tagged-parse-support-only.diff 和 CLJ-976-queue-literal-eval.diff),分别于 2012 年 4 月 27 日和 5 月 4 日发布,都无法在 2012 年 5 月 10 日最新的 master 版本中顺利应用。

0
by

由:fogus_ 添加的注释

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

0
by

由: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 中的“筛选票据”部分推荐的。我在遇到另一个使用此选项应用成功但未使用时应用失败的补丁后添加了建议的 --keep-cr 选项。

0

由:jafingerhut_ 添加的注释

由于最新的补丁使用 --keep-cr 选项后能够干净地应用,因此我擅自将“批准”从“不完整”改回“测试”。

0

评论者:richhickey

需要更多时间

0

由: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相同。这个补丁简单地移除了一行Rich在之后的提交中添加到clojure.iml中的代码,因此这个补丁现在可以干净地应用到最新的master分支上。

...