Clojure宏与协议深度解析
宏相关问题与解决方案
在Clojure编程中,宏的使用会遇到一些问题,比如类型提示元数据丢失。以 or 宏为例,它通常会丢弃类型提示元数据,导致反射警告。
(set! *warn-on-reflection* true)
(defn first-char-of-either
[a b]
(.substring ^String (or a b) 0 1))
上述代码会产生反射警告,因为 or 宏没有传播 ^String 类型提示。我们可以通过查看宏展开结果来验证这一点:
(binding [*print-meta* true]
(prn '^String (or a b)))
(binding [*print-meta* true]
(prn (macroexpand '^String (or a b))))
为了解决这个问题,我们可以重新定义一个宏 OR ,确保用户提供的类型提示元数据被保留。
(defn preserve-metadata
"Ensures that the body containing `expr` will carry the metadata
from `&form`."
[&
超级会员免费看
订阅专栏 解锁全文
672

被折叠的 条评论
为什么被折叠?



