gpt4 book ai didi

java - Clojure 宏实例化异常

转载 作者:行者123 更新时间:2023-11-30 09:21:42 25 4
gpt4 key购买 nike

我有一个在 repl 中工作的宏,它似乎在 let 之外以及 let 内部的代码中工作,如下所示。但是它也坏了,我不知道为什么。该宏基本上只是将第一个参数作为要调用的函数,并将 into-array 放在最后一组参数之前,并将最终非集合参数的类作为参数添加到 into -数组,如果它在 java 类层次结构中。

(defmacro jvar [method & args]
(let [lastargs (last args)
evaled-lastargs (eval lastargs)]
(if (coll? evaled-lastargs)
(let [firstargs (butlast args)
klass (eval (last firstargs))
supset (map #(supers (class %)) evaled-lastargs)
common (apply intersection #{klass} supset)]
(if (seq common)
`(~method ~@(butlast firstargs) (into-array ~(first common) ~lastargs))
`(~method ~@firstargs (into-array ~lastargs))))
(throw (Error. "Last argument must be defn.")))))

用法:在回复中:

jfxcircles.core>  (macroexpand '(jvar Group. Node [(Circle. 100)]))
(new Group (clojure.core/into-array javafx.scene.Node [(Circle. 100)]))
jfxcircles.core> (jvar Group. Node [(Circle. 100)])
#<Group Group@c26729e>

let 中:

(let [root (Group.)
scene (Scene. root 800 600) ;etc. this is for JavaFX
...
circ (Circle. 100)
inner-group1 (jvar Group. [(Circle. 100)]) ; works
inner-group2 (jvar Group. [circ]) ; Instantiation Exception
inner-group3 (jvar Group. [(Rectangle. 100 100)]) ; works
inner-group4 (jvar Group. [(Rectangle. (.getWidth scene) 100)]) ; Instantiation exception
)

所以基本上它不会在某些情况下编译,否则应该是相同的,我无法执行 macroexpand 因为它不会编译。有什么想法吗?

谢谢

最佳答案

宏扩展器在编译时应用;它无法操纵作为参数接收的表单的运行时值,eval 或不,除非某些表单在编译期间和运行时始终具有相同的值(自评估形式,一些构造函数调用等)。正是由于这种幸运的巧合,问题文本中出现的宏有时似乎有效;但是,如果不将它试图通过 eval 获取的信息转化为一组显式参数,就无法使其正常工作。

关于java - Clojure 宏实例化异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16822834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com