分享您的想法,请参加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

未解决问题:队列文本的参数应该评估吗?以下示例说明了这一点

`
;; 不评估情况

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


这是否意味着一个 {{queue}} 函数(类似于 {{vector}})也将出现?这将对 HOF 使用很有帮助。
0

由 fogus 发表的评论:

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

0

由 pmbauer 发表的评论:

除了 Chas 对记录字面量一致性的观察外,队列字面量中的 eval 是否会打开像 #= 一样的安全漏洞,需要尊重 读取-评估
当需要在队列字面量中使用 eval 时,嵌入 #= 似乎更为合适。

0

由 fogus 发表的评论:

支持可 eval 的队列字面量。

0

由 jafingerhut 发表的评论:

日期为 2012 年 4 月 27 日的 CLJ-976-queue-literal-tagged-parse-support-only.diff 和日期为 2012 年 5 月 4 日的 CLJ-976-queue-literal-eval.diff 这两个补丁都无法干净地应用到 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 发表的评论:

使用最新的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行结束符,而这些Clj源文件确实有一些这样的行结束符。

上面(带--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版本上。

...