26、Clojure宏与协议深度解析

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`."
  [&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值