欢迎!请查看关于页面,以了解更多关于如何使用本站的信息。
Clojure的PersistentQueue结构已经存在一段时间,并且已经出现在了许多代码库中。然而,队列的创建通常是一个两步操作,形式如下:
`(conj clojure.lang.PersistentQueue/EMPTY :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组中被提出并讨论。
开放性问题:队列字面量的参数应该求值吗?这一点的含义如下所示:
`;; non-eval情况
;=> #queue [1 2 (+ 1 2)]
;; eval情况
;=> #queue [1 2 3] `
对这个开放问题的回答将决定实现方式。
评论者:[email protected]
我认为非求值行为将与其他Clojure 1.4的读取器字面量保持一致。对于需要其他语言实现处理一些字面量表示,而不是Clojure表达式求值的情况,这肯定更好。如果参数需要求值,请使用常规函数。
由:fogus 发表的评论
只添加了对标记字面量支持的补丁。这仅仅是整个解决方案的一部分。这提供了读取字符串和打印能力。在我深入编译器之前,我希望更多关于 eval 方面的讨论。
由:pmbauer 发表的评论
除了 Chas 对记录字面量一致性的观察之外,在队列字面量中 eval会不会开启与 #= 相同的安全漏洞,需要尊重 read-eval?当在队列字面量中需要 eval 时,内嵌 #= 似乎更合适。
支持可 eval 的队列字面量。
由:jafingerhut 发表的评论
截至 2012 年 5 月 10 日的最新 master 版本中,两个补丁都没有顺利应用:日期为 2012 年 4 月 27 日的 CLJ-976-queue-literal-tagged-parse-support-only.diff 和 2012 年 5 月 4 日的 CLJ-976-queue-literal-eval.diff。
更新了补丁文件以合并最新的 master 版本。
支持语法引用的新补丁
评论者:stuart.sierra
自提交 f5f4faf95051f794c9bfa0315e4457b600c84cef 起补丁无法应用
奇怪。刚刚我成功下载了 CLJ-976-queue-literal-eval-and-synquote.diff 补丁并将其应用于 HEAD(f5f4faf95051f794c9bfa0315e4457b600c84cef)。存在一些空白警告,但补丁已应用,编译并通过所有测试。
使用最新版本的 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 选项。
假设性地将批准状态从“不完整”改回“测试”,因为最新补丁在使用 --keep-cr 选项的情况下可以干净地应用。
评论者:richhickey
需要更多时间
富,
你能否提供更多信息?如果需要,我会很高兴做出任何改变。然而,如果这只是关系到EDN以及/或者等待下一个版本的话,我也乐意等待。不管怎样,我都想完成这件事或者把它放在一边。谢谢。
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分支了。