読者です 読者をやめる 読者になる 読者になる

Clojure で生成するクラスでフィールドをあれこれするのってどーするの?

clojure

cradle を作っているんだけども、実装を Java いクラスを作るか、全部関数で行えばいいか迷う。
とりあえず、gen-class でやってみたんだけど、なんか違ったっぽい:

(gen-class
 :name "org.cradle.BuildResult"
 :init "init"
 :prefix "build-result-")

(defn build-result-init [cradle failure]
  ;; フィールドってどうやるの???
  )

(defn build-result-getCradle [this]
  ;; そこがわからないとここも実装できない
  )

ということでこんな感じにしてみた:

(deftype BuildResult [failure cradle]
  (getCradle [this]
    cradle)

  (getFailure [this]
    failure)

  (rethrowFailure [this]
    (if (instance? CradleException failure)
      (throw failure))
    (if (not (nil? failure))
      (throw (CradleException. "Build aborted because of an internal error." failure)))
    this))