2024年Clojure调查)中分享您的想法!

欢迎!请访问关于页面了解更多关于本站如何工作的信息。

+9
语法和reader

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

我认为非eval行为将与Clojure 1.4中其他reader字面量保持一致。对于与其他语言实现交互的情况,这肯定更好,其中可能期望处理一些字面量表示,但不需要对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发表的评论

可实行队列字面量支持。

0

由jafingerhut发表的评论

CLJ-976-queue-literal-tagged-parse-support-only.diff(日期为2012年4月27日)和CLJ-976-queue-literal-eval.diff(日期为2012年5月4日)这两个补丁都无法与截至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 行结束符的迹象:Clojure 源文件中肯定有一些是这样的。

上面的命令(带有 --keep-cr)目前是http://dev.clojure.org/display/design/JIRA workflow 页面 "Screening Tickets" 部分 "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于2012年7月20日的补丁CLJ-976-queue-literal-eval-and-synquote.diff相同。它仅移除Rich随后在不同提交中添加到clojure.iml的行,因此此补丁现在可以干净地应用于最新的master。

...