请分享您的看法在 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 组中提出并讨论过。

开放性问题:队列字面量的参数应该进行求值吗?这一点在下面的示例中得到了说明:

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

我认为非求值行为将与其他 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)}


这意味着队列 fn(类似于 {{vector}})也会出现吗? 这对于 HOF 使用很有用。
0
by

评论者:fogus

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

0
by

评论者:pmbauer

除了 Chas 对记录字面量一致性观察之外,队列字面量中的 eval 会不会像 #= 一样打开相同的漏洞,需要遵守 read-eval
需要在队列字面量内使用 eval 时,嵌入 #= 似乎更为合适。

0
by

评论者:fogus

支持 eval 的队列字面量。

0
by

评论者:jafingerhut

截至 2012 年 5 月 10 日的最新 master 版本中,补丁 CLJ-976-queue-literal-tagged-parse-support-only.diff 日期为 2012 年 4 月 27 日以及补丁 CLJ-976-queue-literal-eval.diff 日期为 2012 年 5 月 4 日都无法干净地应用。

0
by

评论者:fogus

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

0

评论者:fogus

包含对 syntax-quote 的支持修复的补丁。

0

评论者:stuart.sierra

自提交f5f4faf95051f794c9bfa0315e4457b600c84cef以来,此补丁无法应用。

0

评论者:fogus

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

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

妄自更改批准状态,从“不完整”变回“测试”,因为最新的补丁如果在 --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分支上。

...