如何将指定Clojure代码转换为Hy代码,实现本地重绑定+为-并输出2?
解决Hy中本地替换
+为-的问题 在Clojure中,+是普通函数,可通过let本地绑定覆盖,但Hy会将(+ x y)编译为Python的x + y操作符,而非函数调用,直接绑定+无法生效,导致输出4而非2。
要实现需求,需通过宏递归替换表达式中的+为普通符号,再绑定该符号为减函数:
(defmacro q [expr] ;; 递归替换表达式内所有'+'为普通符号local-plus (setv replaced (hy.core.util.recur-replace expr {'+ 'local-plus})) `(let [local-plus (fn [x y] (- x y))] ~replaced)) (print (q (+ 3 1)))
运行这段代码会输出2,因为宏将(+ 3 1)转换为(local-plus 3 1),而local-plus被绑定为实现减法的函数,最终执行3-1得到结果。
内容的提问来源于stack exchange,提问作者Takis
相关产品推荐
相关产品推荐

