这里的“graph”是高阶函数,它返回一个在其范围内设置了配置的函数:
(ns bulbs.neo4jserver.graph)
(defn out1
"Test func that simply returns out1."
[config]
"out1")
(defn graph
[config]
(fn [func & args]
(apply func config args)))
您创建一个图形实例,然后可以使用它来调用其他函数并自动传入配置参数:
(def g (graph {:root-uri "http://localhost"}))
(g out1)
;; => "out1"
这行得通;但是,如果您需要/将图形导入另一个命名空间,则必须在每个函数调用前加上图形命名空间:
(ns bulbs.neo4jserver.junk
(:require [bulbs.neo4jserver.graph :as graph]))
(def g (graph/graph {:root-uri "http://localhost"}))
;; would rather do (g out1)
(g graph/out1)
相反,我想在apply
函数中明确指定命名空间,这样用户就不必:
(defn graph
[config]
(fn [func & args]
;; somehow specify the graph namespace here
(apply func config args)))
最好的方法是什么?