以下两个代码片段的行为差异很大,这仅仅取决于你定义函数的顺序。我发现这种行为很令人惊讶,可能不是预期行为。
(ns jimka-test
(:require [clojure.pprint :refer [cl-format]]))
(declare f)
(defn g []
(map f '(1 2 3)))
(def ^:dynamic f (fn [x] (* x x)))
(defn h []
(assert (= (g) '(1 4 9)))
(binding [f (fn [x] (+ x x))]
(assert (= (g) '(2 4 6))
(cl-format false "(g) returned ~A" (g)))))
(h)
现在交换 f
和 g
的定义顺序。
(ns jimka-test
(:require [clojure.pprint :refer [cl-format]]))
(declare f)
(def ^:dynamic f (fn [x] (* x x)))
(defn g []
(map f '(1 2 3)))
(defn h []
(assert (= (g) '(1 4 9)))
(binding [f (fn [x] (+ x x))]
(assert (= (g) '(2 4 6))
(cl-format false "(g) returned ~A" (g)))))
(h)
我的建议是,如果变量声明为非动态,则后面的动态定义应该发出警告。
此问题也在 clojureverse 上进行了讨论