フォームを指定して、欠落しているすべてのシンボルを自分自身として定義するマクロを作成しようとしています。
今までに私は次のものを持っています:
(def ^:private missing-symbol-pattern #"Unable to resolve symbol: (.+) in this context")
(cl/defn ^:private missing-symbol [s]
(cl/when-let [[_ sym] (cl/re-find missing-symbol-pattern s)] sym))
(cl/defmacro try-eval [expr]
`(try (do (cl/println '~expr) (cl/eval '~expr))
(catch Exception e#
(cl/if-let [sym# (do (cl/println (.getMessage e#)) (missing-symbol (.getMessage e#)))]
(cl/eval `(do
(def ~(cl/symbol sym#) '~(cl/symbol sym#))
(cl/println ~sym#)
(try-eval ~'~expr)))
(cl/eval `(throw ~e#))))))
(cl
ここにの別名がclojure.core
あります)副作用に問題がある可能性があることは知っていますが、これはここでは重要ではありません(ただし、副作用の問題がない方が良いでしょう)
欠落している(解決できない)シンボルが複数ある場合、次の例外が発生します。
java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: java.lang.ClassCastException: clojure.lang.Symbol cannot be cast to clojure.lang.IDeref, compiling:(shen/primitives.clj:517)
何を変更するかについて誰かが考えていますか?「既製」のソリューションはありますか?
乾杯