我想制作一个宏来定义局部变量范围之外的函数,以捕获程序员(又名我)错误地引用局部范围内的变量的错误。它应该只允许在宏的第一个参数中声明的变量。
例如,以下应该可以正常编译:
(let [ foo 'x
bar 'y ]
(my-macro [ foo ] ;; this designates that foo can be used
(print foo)
)
)
但是,以下内容应该无法编译,因为 my-macro 的第一个参数中没有声明“bar”:
(let [ foo 'x
bar 'y ]
(my-macro [ foo ] ;; only foo is declared here, but bar
;; is used, so should fail to compile
(print foo)
(print bar) ;; <-- should fail here
)
)
除了错误检查之外,宏还需要返回一个包含所用变量值的向量和一个包含主体的函数。这就是我到目前为止所拥有的。
(defmacro my-macro
[ declared-vars-in-use & body ]
`[~declared-vars-in-use (fn [~@declared-vars-in-use]
~@body
)
]
)
我唯一不知道怎么做的是在引用本地范围内未在 my-macro 中声明的符号时强制编译错误(上例中的“bar”)。如果我使用了不正确的术语,请原谅我,希望你能理解这一点,我还是 clojure 的新手。