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

评论者:[email protected]

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

0
_评论者:cemerick_

记录的前例似乎相关


=> (defrecord A [b])
用户.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}})也将出现?这对于使用高阶函数来说会很有用。
0

评论者:fogus

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

0

评论者:pmbauer

除了 Chas 对记录字面量一致性的观察之外,队列字面量中的 eval 是否会像 #= 一样打开同样的安全漏洞,需要尊重 read-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

新补丁包含了对 syntax-quote 的支持。

0
by

评论人:stuart.sierra

补丁在提交 f5f4faf95051f794c9bfa0315e4457b600c84cef 时未能应用

0
by

评论者:fogus

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

0
by

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

评论者:jafingerhut

妄自更改批准状态从“不完整”回“测试”,因为最新的补丁在使用 --keep-cr 选项时能够干净地应用。

0
by

评论人:richhickey

需要更多时间

0
by

评论者:fogus

Rich,

您能否提供更多细节?如果需要,我会很乐意做出任何更改。但是,如果是关于EDN的关系或等待下一版本的问题,我愿意等待。在任一情况下,我都想完成这项工作或将它放在心里。谢谢。

0
by

评论者: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后来在另一个提交中添加了这个行,因此,现在这个补丁可以干净地应用于最新主分支。

...