gpt4 book ai didi

binding - 为什么我不能在clojure中绑定(bind)+?

转载 作者:行者123 更新时间:2023-12-03 22:53:06 33 4
gpt4 key购买 nike

谁能解释为什么我可以重新绑定(bind)列表但不能+?

(binding [list vector]
(list 1 3))
(binding [list +]
(list 1 3))
(binding [+ list]
(+ 1 3))

我想重新绑定(bind) + 以便我可以进行部分评估。

最佳答案

至少在 Clojure 1.1.0 中,+带有两个参数的内联是为了提高性能。你的绑定(bind)发生得太晚了。有了更多的论点,它的工作方式就不同了。

Clojure 1.1.0-master-SNAPSHOT
user=> (binding [+ -] (+ 1 2))
3
user=> (binding [+ -] (+ 1 2 3))
-4

一种解决方法是创建自己的命名空间和影子 clojure.core/+用你自己的功能。
user=> (ns foo (:refer-clojure :exclude [+]))
nil
foo=> (defn + [& args] (reduce clojure.core/+ args))
#'foo/+
foo=> (+ 1 2)
3
foo=> (binding [+ -] (+ 1 2))
-1

请注意,在 Clojure 1.2.0 的当前快照中,内联似乎更加激进。
Clojure 1.2.0-master-SNAPSHOT
user=> (binding [+ -] (+ 1 2))
3
user=> (binding [+ -] (+ 1 2 3))
6

使用 + 以外的函数名可能是最明智的。 ,例如 add , 以免混淆。

关于binding - 为什么我不能在clojure中绑定(bind)+?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2352211/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com