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

开放性问题:队列文字的参数应该eval吗?这会产生以下影响

`
;; non-eval情况

queue [1 2 (+ 1 2)]

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

;; eval情况

queue [1 2 (+ 1 2)]

;=> #queue [1 2 3]
`

这个问题答案将决定实现的方案。

20 个回答

0

评论者:

我认为非eval行为将与Clojure 1.4中的其他读取器文字保持一致。它肯定更适合与其他语言的实现进行交互操作,其中可能期望处理一些文字表示,但不应该对Clojure表达式进行评估。如果需要参数评估,请使用常规函数。

0
_评论者:

记录的前例似乎相关


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


这意味着一个{{队列}}函数(类似于{{向量}})也会出现吗?这对于HOF的使用会很有用。
0

评论者:fogus

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

0

评论者:pmbauer

除了Chas对记录字面量一致性的观察之外,队列字面量中的eval是否会像#=一样打开同样的安全漏洞,需要尊重read-eval
当需要在队列字面量中执行eval时,嵌入一个#=似乎更为恰当。

0

评论者:fogus

可求值的队列字面量支持。

0

评论者: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

评论者:fogus

已更新补丁文件以与最新master合并。

0

评论者:fogus

新增支持语法括号的补丁。

0

评论者:stuart.sierra

补丁自提交f5f4faf95051f794c9bfa0315e4457b600c84cef无法应用

0

评论者:fogus

奇怪。我已经能成功下载CLJ-976-queue-literal-eval-and-synquote.diff补丁,并应用到当前状态(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

因最新补丁应用正常,故从“不完整”状态修改为“测试”。

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 之后在一个不同的commit中添加到 clojure.iml 的一行,这样这个补丁现在可以干净地应用到最新的master代码。

...