Clojure: How to create a function at runtime
clojure, functional-programming
Solution
(defn gen-fn
[n as b]
(let [n (symbol n)
as (vec (map symbol as))
fn-value (eval `(fn ~n ~as ~b))]
(intern *ns* n fn-value)))
And some use:
user=> (gen-fn "foo" ["x"] '(do (println x) (println (inc x))))
#'user/foo
user=> (foo 5)
5
6
nil
However, I don't really like this approach. It smells really hard: `eval`. Why do you want to generate globals at runtime? I see various problems with wrong namespaces and other ugly hiccups rising at the horizon...
Problem
I want to generate a fn totally at runtime (i.e. the name and the arg symbols are decided at runtime, not in code) What's the best way to achieve this ? For example how can I implement the following function ? ``` (defn gen-fn [name arg-symbols body] ... ... ``` which would be used like this: ``` (gen-fn "my-func-name" (symbol "x") (symbol "y") (println "this is body. x=" x)) ``` Note that function name, the args and the body are not coded but can be decided at runtime