让 clojure 生成一个 java class ,它像构建器模式一样使用

Have clojure generate a java class which is used like a builder pattern

我正在尝试使用 clojure 构建一个 java 库。我希望 class 符合 java 规范,这意味着我希望构建器模式是最直观的。使用它的图书馆会这样称呼它

 String actualHtml =
      builder
        .setTitle("Pizza Time")
        .setProperty(n)
        .setProperty(n+1)
        .build();

通过一个奇怪的编译步骤,我可以通过擦除每个方法中的 return 值来编译它,编译,然后添加它们并再次编译......但我想知道如果有更标准的方法。

(ns scorecard.core
  (:gen-class
    :name scorecard.Builder
    :state state
    :init init
    :methods [[setTitle [String] scorecard.Builder ]
             [[setProperty [String] scorecard.Builder ]
              [build [] String ]]))

以上将失败

Exception in thread "main" java.lang.ClassNotFoundException: scorecard.Builder, compiling:(scorecard/core.clj:1:1)

如果我删除 return 值编译,然后再次编译它就可以了。我试图添加预编译配置文件,但依赖项与 :gen-class 方法位于同一文件中。

  :profiles { :precomp { 
                         :source-paths ["src/scorecard"]
                         :aot [parser.ast] } })

有没有一种方法可以声明一个 return 值,该值 return class 本身不会引发错误?

这是已知的bug

这就是我在 class 文件中解决问题的方法 添加 gen-class 两次

   (:gen-class
   :name scorecard.Builder)

   (:gen-class
    :name scorecard.Builder
    :state state
    :init init
    :methods [[setTitle [String] scorecard.Builder ]
    [build [] String ]])

然后在我的 project.clj 文件中添加 prep-task 进行预编译。这允许您针对 class 进行 运行 测试。

  :prep-tasks [["compile" "scorecard.core"]
               "javac" "compile"]