请在2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面了解如何使用本网站。

0
Clojure

支持任意功能解构,即在任意解构形式中使用任意的函数来帮助以任意方式解包数据。
以下是几个示例,现在可以正常工作:
用户=> (let [link: (-> str a) 1] a)

用户=> (let [link: [a (-> str b) c] [link: 1 2]] (list a b c))
用户=> (let [link: (->> (map int) [a b)] "ab"] (list a b))

讨论开始于此:
http://clojure-log.n01se.net/date/2009-11-17.html#09:31c

相应的补丁实现了此处描述的规范:

http://clojure-log.n01se.net/date/2009-11-17.html#10:50a
"1"

也就是说,以下示例现在将工作:
用户=> (let [link: (-> str "a") 1] a)

用户=> (let [link: [a (-> str "b") c] (link: 1 2)] (list a b c))
(97 98)

8个回答

0

由: importer评论

cgrand说:我认为当前的补丁也受到此处描述的问题的影响 http://groups.google.com/group/clojure-dev/msg/80ba7fad2ff04708

0
_由: importer评论_

cgrand说:这里只允许使用 -> 和 ->>,但如果它们被别名或阴影,怎么办?而不是对符号本身进行测试,我会检查:
* 符号不在 &env 中
* 符号解析到 #'clojure.core/-> 或 '#'clojure.core/->>


(当不 (&env (first b)) (#{#'clojure.core/-> #'clojure.core/->>} (resolve (first b))))


但这需要更改解构的 sig 以传递 env
0
_由: importer评论_

[email protected] 说:实际上这里只剩下 -> 和 ->> 是合法的 —— 如果你在本地将 foo 绑定到 -> 上,真正有意义的理由是认为 (fn [(foo inc a)] a) 应该能工作。此外,如果你在你的命名空间中重新定义 -> 或 ->> 以表示其他含义,我们是否需要在编译时捕获这一点,还是可以发出重新排列的代码看看会发生什么?

总之,'#{-> ->> clojure.core/-> clojure.core/->>} 是否足够呢?
0
0

由: importer评论

[email protected] 说:[文件链接](link: [file:aHWQ_W06Kr3O89eJe5afGb)] [修改链接](link: PATCH) 支持解构形式中的 -> 和 ->>。

0

由: importer评论

richhickey 说:所以,不要使用 syntax-quote,只要使用 clojure.core/->

0

评论由:stu 提出

Rich:你是意外被分配的吗?如果是,请解除你的分配。

0
参考:[问题链接](https://clojure.atlassian.net/browse/CLJ-211)(由 alex+import 提出)
...