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

我认为非评估行为将与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)}


这是否意味着队列函数fn(类似于{{vector}})也会出现?这对于HOF的使用会更方便。
0

评论者:fogus

增加了一个仅针对已标记字面量支持的补丁。这只是整体解决方案的一部分。这提供了字符串读取和打印功能。在我深入编译器之前,我希望更多关于eval方面的讨论。

0

评论者:pmbauer

除了Chas对记录字面量一致性的观察,队列字面量中的eval是否会导致与#=相同的网络安全漏洞,需要尊重read-eval
在需要队列字面量内的eval时,嵌入一个#=似乎更为合适。

0

评论者:fogus

可eval的队列字面量支持。

0

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

评论者:fogus

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

0

评论者:fogus

新补丁支持固定语法quote。

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”中推荐的。我在遇到另一个需要该选项才能应用但无需选项的补丁后添加了建议的 --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版本。

...