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组中被提出并讨论。

开放性问题:队列字面量的参数应该求值吗?这一点的含义如下所示:

`
;; non-eval情况

queue [1 2 (+ 1 2)]

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

;; eval情况

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)}


这依然是有意义的,否则队列就需要在列表周围打印额外的 {{(quote …)}} 形式——这通常是记录巧妙避免的


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


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

由:fogus 发表的评论

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

0
by

由:pmbauer 发表的评论

除了 Chas 对记录字面量一致性的观察之外,在队列字面量中 eval会不会开启与 #= 相同的安全漏洞,需要尊重 read-eval
当在队列字面量中需要 eval 时,内嵌 #= 似乎更合适。

0
by

由:fogus 发表的评论

支持可 eval 的队列字面量。

0
by

由: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。

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 发表的评论

假设性地将批准状态从“不完整”改回“测试”,因为最新补丁在使用 --keep-cr 选项的情况下可以干净地应用。

0

评论者:richhickey

需要更多时间

0
by

由:fogus 发表的评论

富,

你能否提供更多信息?如果需要,我会很高兴做出任何改变。然而,如果这只是关系到EDN以及/或者等待下一个版本的话,我也乐意等待。不管怎样,我都想完成这件事或者把它放在一边。谢谢。

0
by

由: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分支了。

...