MB
Size: a a a
MB
KC
MB
KC
KC
IG
MK
(let [a 1
b 2
f1 (fn [] a)
f2 (fn [] b)]
(get-closures f2)) ;;#=> [b]
ilter symbol? (flatten `(fn [x] 'y))) не очень подходит, т.к. возвращает в том чилсе и y
или нужно смотреть в сторону tools.analyzer? но это как-то сложноAR
(let [a 1
b 2
f1 (fn [] a)
f2 (fn [] b)]
(get-closures f2)) ;;#=> [b]
ilter symbol? (flatten `(fn [x] 'y))) не очень подходит, т.к. возвращает в том чилсе и y
или нужно смотреть в сторону tools.analyzer? но это как-то сложноMK
&env?MK
MK
(ns foo
(:import
[clojure.lang Compiler Compiler$C]))
(defn get-closure-names* [form env]
(let [ex (with-bindings {Compiler/LOCAL_ENV env}
(Compiler/analyze Compiler$C/EXPRESSION form))
closes (.closes ex)]
(->> closes
(keys) ;; у них ключи и значения совпадают
(map #(.-sym %)))))
(defmacro get-closure-names [form]
`(quote ~(get-closure-names* form &env)))
(let [a 1
b 2]
(get-closure-names (fn [x] [a]))) ;;=> '(a)
(partial str a) уже не работает т.к. она уже готовый объект возвращает.MK
DA
DA
IG
IG
MG