我正在尝试使用clojure创建用于打包软件的DSL。我想定义宏,函数等,然后加载一个文件,我希望我定义的所有东西都与文件本身在同一名称空间中,这样如果我定义一个宏abe
,我可以在不使用abe
的完全限定名称的情况下在文件中使用它。
到目前为止,我有这个:
(binding [*ns* (find-ns 'my-namespace)]
(load-file "Myfile"))
但我觉得我做错了。
此外,甚至可以在clojure文件中访问本地绑定变量。像这样:
(let [a 1]
(binding [*ns* (find-ns 'my-namespace)]
(load-file "myfile")))
a
中可以使用myfile
。
这个想法是允许程序员指定如何在真正的clojure中打包,但是语言以对程序员透明的方式扩展。
有更好的方法吗?是否有更好的“惯用”方式在clojure中创建DSL?