When in doubt, ask the computer! I wrote a quick test:
(ns tst.demo.core
(:use demo.core tupelo.core tupelo.test))
(defn create-fn
[n]
(let [fname (symbol (format "add-%d" n))
body (vector '[x] (list '+ n 'x))
fn-form (apply list 'clojure.core/defn fname body)
fn-ref (eval fn-form)]
fn-ref))
(defn create-and-call-fn
[n]
(let [fn-ref (create-fn n)
fn-result (fn-ref 3)]
(when-not (= (+ 3 n) fn-result)
(throw (ex-info "bad result" (vals->map n fn-result))))))
(dotest
(let [f5 (create-fn 5)
f5-result (f5 3)]
(is= 8 f5-result))
(dotimes [i 99999]
(when (zero? (mod i 100)) (spyx i))
(create-and-call-fn i)))
and up to 100K function creations later, it still works. YMMV!
The above is based on this template project.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…