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

欢迎!请查看关于页面以获取有关如何操作的更多信息。

+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])
用户.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)}


这意味着队列 fn(类似于 {{vector}})也会出现吗?这会对 HOF 使用很有帮助。
0
by

评论由:fogus 提出

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

0
by

评论由:pmbauer 提出

除了 Chas 对记录字面的量一致性观察之外,队列字面上的 eval 是否会像 #= 一样打开相同的安全漏洞,需要遵守 read-eval 吗?
在队列字面量内部需要 eval 时,嵌入 #= 似乎更为合适。

0
by

评论由:fogus 提出

Evalable 队列字面量支持。

0
by

评论由:jafingerhut 提出

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

0
by

评论由: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 提出

假定地更改审批状态从 Incomplete(不完整)回到 Test(测试),因为如果使用 --keep-cr 选项,最新的补丁可以干净地应用。

0

评论者:richhickey

这需要更多时间

0

评论由:fogus 提出

Rich:

您能否提供更多细节?如果需要,我将很高兴进行任何更改。然而,如果这只是一个关于它与 EDN 的关系,或者等待下一个版本的话,我会很乐意等待。在任何情况下,我都想完成这件事,或者将其放在我心里。谢谢。

0

评论由:jafingerhut 提出

2012年10月5日的clj-976-queue-literal-eval-and-synquote-patch-v2.txt与2012年7月20日的Fogus补丁CLJ-976-queue-literal-eval-and-synquote.diff相同。它只删除了Rich后来在另一个提交中添加到clojure.iml中一行代码,所以这个补丁现在可以干净地应用到最新的master。

...