2024 Clojure状态调查!分享你的想法。

欢迎!请查看关于页面以了解更多该系统的信息。

+9
语法和读取器

Clojure的持久队列结构已经在语言中存在一段时间,并且已经应用到许多代码库中。然而,队列的创建通常是一个两步操作,形式如下

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


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

评论由:fogus 提供

仅添加了对标记字面量支持的补丁。这是整体解决方案的一部分。这提供了读字符串和打印的能力。在我着手编译器之前,我希望更多人围绕eval方面进行讨论。

0

评论由:pmbauer 提供

除了Chas对记录字面量一致性的观察外,队列字面量中的eval会否导致与#=相同的网络安全漏洞,需要尊重 read-eval 呢?
当需要在队列字面量内部使用eval时,嵌套#=可能更合适。

0

评论由:fogus 提供

支持可求值的队列字面量

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 提供

将修复文件更新以与最新主分支合并。

0

评论由:fogus 提供

添加了对语法引用的支持的新补丁。

0

评论者为:stuart.sierra

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

0

评论由:fogus 提供

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

0

评论由:jafingerhut 提供

使用最新头部,我成功使用以下命令应用补丁 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
by

评论人:richhickey

这需要更多时间

0
by

评论由:fogus 提供

Rich,

你是否介意提供更多细节?如有需要,我会很乐意做出任何更改。然而,如果这只是一件与EDN相关或等待下一个版本的事情,我将很高兴等待。在任何情况下,我都希望完成这个任务或将它放在我脑后。谢谢。

0
by

评论由: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版本中。

...