请在 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

开放性问题:队列字面量的参数应该评估吗?下面的例子说明了这个问题的影响

`
;; 非评估案例

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 中的其他读取器字面量保持一致。对于与其他语言交互的情况,ämää

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


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

评论者:fogus

仅对标注文字支持添加了补丁。这是整个解决方案的一部分。这提供了读取字符串和打印功能。在进行编译器之前,我希望更多地讨论 eval 方面。

0

评论者:pmbauer

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

0

评论者:fogus

支持可 eval 的队列文字。

0

评论者:jafingerhut

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

0

评论者:fogus

已更新补丁文件,以合并到最新 master 版本中。

0

评论者:fogus

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

0

评论者:stuart.sierra

补丁自提交 f5f4faf95051f794c9bfa0315e4457b600c84cef 起无法应用

0

评论者:fogus

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

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

评论者:jafingerhut

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

...