Here “graph” is higher-order function that returns a function with config set in its scope:
(ns bulbs.neo4jserver.graph)
(defn out1
"Test func that simply returns out1."
[config]
"out1")
(defn graph
[config]
(fn [func & args]
(apply func config args)))
You create an instance of graph, which can then be used to call other functions and automatically pass in the config arg:
(def g (graph {:root-uri "http://localhost"}))
(g out1)
;; => "out1"
This works; however, if you require/import graph into another namespace, then you have to prefix each function call with the graph namespace:
(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)
Instead, I want to explicitly specify the namespace in the apply function so that users don’t have to:
(defn graph
[config]
(fn [func & args]
;; somehow specify the graph namespace here
(apply func config args)))
What’s the best way to do this?
You can pass symbol instead of function and resolve it in
graphfunction:And call it:
But
gis not an high-order function any more. It takes symbol, not function. Personally I don’t like this approach. Why don’t you like specifying namespace? May be you can do what you need with macro too, but I don’t know macros well.EDIT
Don’t do it. Use regular functions as explained by @Ankur and @Gert in comments.