macros - Clojure 宏到文件中的 "insert"代码

标签 macros clojure

我有一个包含一些表单的文件,例如

(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/

相关文章:

clojure - clojure有merge-if-exists函数吗?

clojure - Clojure 中的线程注释

clojure - 如何为规范中的两个不同路径生成相同的值?

c++ - 跟踪宏扩展

replace - Notepad++,在突出显示的文本周围添加括号的快捷方式

emacs - 什么 elisp 或宏魔术可以进行这种文本转换?

clojure - 进行 (map f c1 c2) map (count c1) 次,即使 c2 的元素较少

C 宏的创造性/有趣用途;元编程

testing - iMacros 很好但不可靠。还有其他选择吗?

clojure - 如何在 Clojurescript 中强制评估嵌套宏?