如果我这样做,例如:
(defmacro qqq [] '(toString [this] "Qqq"))
(reify Object (qqq))
Run Code Online (Sandbox Code Playgroud)
它失败是因为reify看到(qqq)而不是(toString [this] "Qqq").
在通常的解决办法是,包"具体化"与我自己的事情调用宏,但它更长,更具侵入性.
如何使我的宏更强大,通常的宏首先扩展?
期待像:
(defmacro ^{:priority 100500} qqq [] '(toString [this] "Qqq"))
(reify Object (qqq))
Run Code Online (Sandbox Code Playgroud)
要么
(defmacro qqq [] '(toString [this] "Qqq"))
(expand-first #{qqq} (reify Object (qqq)))
Run Code Online (Sandbox Code Playgroud) 我想在一个字符串中发送一个clojure表达式,以便在接收者处进行评估,这可能是一个用compojure编写的Web服务.例如,假设我有字符串"(*7 6)",我想把它变成'(*7 6),然后我可以传递给eval并得到42.这个操作在JavaScript中是微不足道的,但是不太确定如何在clojure中做到这一点.提示?
我在clojure中有一个java类,它来自一个返回类的方法.我想要打开这些,如下:
(case type
java.lang.String (println "Found String" name)
java.lang.Long (println "Found Long" name)
java.nio.ByteBuffer (println "Found ByteBuffer" name)
java.lang.Boolean (println "Found Boolean" name)
java.math.BigDecimal (println "Found BigDecimal" name)
java.lang.Double (println "Found Double" name)
java.lang.Float (println "Found Float" name)
java.net.InetAddress (println "Found InetAddress" name)
java.lang.Integer (println "Found Integer" name)
java.util.Date (println "Found Date" name)
java.util.UUID (println "Found UUID" name)
java.math.BigInteger (println "Found BigInteger" name)
java.util.List (println "Found List" name)
java.util.Set (println "Found Set" name)
java.util.Map (println "Found Map" name))
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个时,我得到了
java.lang.IllegalArgumentException: …Run Code Online (Sandbox Code Playgroud)