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 小组中提出并讨论。

开放问题:队列文本文本的参数是否应进行求值?下面的内容说明了这一点

`
;; 非求值情况

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


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

评论者:fogus

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

0

评论者:pmbauer

除了 Chas 对记录字面的一贯性的观察以外,队列字面中的 eval 是否会打开与 #= 相同的安全漏洞,需要尊重 读取-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 的行结束符,而 Clojure 的某些源文件确实如此。

上面的命令(带有 --keep-cr)目前是推荐在页面 http://dev.clojure.org/display/design/JIRA&nbsp;workflow 中“筛选 Issues”部分应用补丁的命令。我在遇到另一个可以带有该选项但无法没有该选项应用的补丁后,增加了推荐的 --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上。

...