2

这行得通,但我很好奇动态传递命名空间并使用 ns-resolve 解析它的性能损失是什么......

(ns bulbs.vertices)

(defn create
  [config data]
  ((ns-resolve (:ns config) 'create-vertex) config data))

然后这样称呼它...

(ns bulbs.neo4jserver.graph
  (:require [bulbs.vertices :as vertices])
  (:require [bulbs.neo4jserver.client :as client]))

(defn graph
  [& [config]]
  (let [config (client/build-config config {:ns 'bulbs.neo4jserver.client})]
    (fn [func & args]
      (apply func config args))))

(def g (graph))

(g vertices/create {:name "James"})
4

1 回答 1

4

除非您ns-resolve是循环的一部分(除非您需要在每次迭代中动态解析不同的函数,否则绝对不需要这样做),我不会担心性能损失。

但是,是的,有性能损失:

user=> (time (dotimes [n 1000000] (let [f (ns-resolve 'clojure.core 'inc)] (f n))))
"Elapsed time: 175.386 msecs"
nil
user=> (time (dotimes [n 1000000] (let [f inc] (f n))))
"Elapsed time: 27.022 msecs"
nil

如果您真的真的需要ns-resolve魔法(但请参阅对您的其他问题的回复,阻止您在特定情况下执行此操作),并且如果您正在解析的函数在循环中使用,请从该循环中取出解析:

user=> (time (let [f (ns-resolve 'clojure.core 'inc)] (dotimes [n 1000000] (f n))))
"Elapsed time: 48.538 msecs"
nil
于 2012-05-13T23:32:38.457 回答