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

欢迎!请查看关于页面以了解更多有关此网站的信息。

+9
语法和读取器

Clojure中的持久队列结构已经存在一段时间,并且已经进入了大量代码库中。然而,创建队列通常是两步操作,通常形式如下

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


这意味着队列函数(类似于{{vector}})也会出现吗?这对于高阶函数的使用很方便。
0

评论者:fogus

仅为标记文字支持添加了一个补丁。这只是完整解决方案的一部分。这提供了字符串读取和打印功能。在深入研究编译器之前,我希望就评估方面进行更多讨论。

0

评论者:pmbauer

除了Chas关于记录文字一致性的观察,队列文字中的eval是否会打开与#=相同的安全漏洞,需要尊重read-eval
当需要在队列文字中嵌入eval时,使用#=似乎更合适。

0

评论者:fogus

支持eval的队列文字。

0

评论者:jafingerhut

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

0

评论者:fogus

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

0

评论者:fogus

增加了对语法引用的支持的补丁。

0

评论人:stuart.sierra

补丁在提交 f5f4faf95051f794c9bfa0315e4457b600c84cef 时无法应用

0

评论者:fogus

奇怪。我刚刚能够下载 CLJ-976-queue-literal-eval-and-synquote.diff 补丁并将其应用到 HEAD(f5f4faf95051f794c9bfa0315e4457b600c84cef)。有一些空格警告,但补丁已经应用,编译并通过了所有测试。

0

评论者:jafingerhut

使用最新的头部,我能够成功应用补丁 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

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上。

...