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

queue [1 2 (+ 1 2)]

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

;; eval case

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


这意味着队列函数(类似于 {{vector}})也将出现吗?这对高阶函数(HOF)使用非常有用。
0

评论人:fogus

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

0

评论人:pmbauer

除了 Chas 关于记录字面量一致性的观察外,队列字面量中的 eval 是否会开启与 #= 相同的安全漏洞,需要遵守 read-eval 吗?
当需要在队列字面量内部进行 eval 时,嵌入 #= 看起来更为合适。

0

评论人:fogus

支持可 eval 的队列字面量。

0

评论人:jafingerhut

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

0

评论人:fogus

已更新补丁文件,以合并最新主分支。

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

评论人: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 日) 相同。它只是删除了 Rich 在不同提交中添加到 clojure.iml 的那行代码添加,这样补丁现在可以干净地应用到最新的 master 版本。

...