请在 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 小组中提出和讨论。

开放问题:队列字面量的参数应该进行求值吗?这会产生以下影响

`
;; 非求值情况

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

奇怪。我刚才能够下载 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 的第 "筛选票据" 部分推荐的。我在遇到另一个使用了该选项且未使用该选项也能应用的补丁后添加了建议的 --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在2012年7月20日修订的CLJ-976-queue-literal-eval-and-synquote.diff相同。它仅仅移除了一条Rich后来在另一个提交中添加到clojure.iml的额外行,因此这个补丁现在可以干净地应用到最新的master版本。

...