我有一个包含一些表单的文件,例如
(clojure.core/defn x [] (clojure.core/+ 5 7))
(clojure.core/defn y [a] (clojure.core/+ a 5))
我想在运行之前“插入”到另一个 Clojure 代码文件中。
大概,我可以使用宏来做到这一点。我尝试编写一个宏来读取文件并在字符串上调用 load-string
,但这会导致在宏内直接评估表单。
即给定上面的文件,我想要
(some-other-code) ...
(my-macro)
(some-more-other-code)
扩展至
(some-other-code) ...
(clojure.core/defn x [] (clojure.core/+ 5 7))
(clojure.core/defn y [a] (clojure.core/+ a 5))
(some-more-other-code)
最佳答案
您可以使用内置的 load
函数来做到这一点:
;; assuming foo.clj is on the classpath
(load "foo")
Clojure 本身会执行此操作,将 clojure.core
拆分为多个文件,请参阅 this one 紧随其后的行在 1.5.1 版本的源代码中。另请注意以这种方式加载的文件顶部的 (in-ns 'clojure.core)
。
当然,使用宏更灵活,因为它允许您在任意位置注入(inject)代码,以任意方式转换代码等。但是,如果您只想在多个文件之间分配命名空间,load
会更简单。
关于macros - Clojure 宏到文件中的 "insert"代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465640/