我将在.toUpperCase宏内调用doto方法,如下所示,但doto返回小写字母:

(doto (java.lang.String. "clojure")
       (.toUpperCase))

返回“clojure”。我进行了宏扩展,并且返回值是创建的对象:(clojure.core/let [G__7359 (java.lang.String. "cojure")] (.toUpperCase G__7359) G__7359),但是为什么我没有得到大写的答案?

最佳答案

doto是Clojure的Java互操作功能的一部分。它旨在使编写Java成为可能,而无需花很多钱。所以

Foo foo = new Foo;
foo.setX().setY().makeFactory().applyPhaseOfMoon();

它具有8个paren成为:
(doto foo .setY .makeFactory .applyPhaseOfMoon)

一共有两个。

在这种情况下,如果我们深入研究您的示例:
user> (doto "hi" .toUpperCase)
"hi"

扩展为:
user> (macroexpand-1 '(doto "hi" .toUpperCase))
(clojure.core/let [G__110453 "hi"]
   (.toUpperCase G__110453)
   G__110453)

第二行执行此操作:
user> (.toUpperCase "hi")
"HI"

然后扔掉答案,并从开始处返回保存的值。我个人从来没有在人们将Java转换为clojure以便调用某些API的地方以外的地方实际使用doto

10-01 02:58