Clojure でつまずきそうなところを解説してみようとした

私が Clojure でつまずいたところをメモっておきます。

Java いオブジェクトの静的メソッドを呼び出すには?

Java いオブジェクトの静的メソッドや定数を呼び出したり取得したりする場合は、クラス名の後にスラッシュ、その後に静的メソッドの名前または定数の名前をつけるだけです。

(ClassName_/staticMethodName)
ClassName/CONST_VALUE

静的メソッドの場合は、Clojure の関数や Java のメソッドを呼ぶ時と同じように、括弧をつけてください。

Java いオブジェクトの public なフィールドにあくせくするにはどーするの?

フィールドに値を設定するには set! を使いましょう。

(let [grid-data (new GridData)]
  (set! (. grid-data horizontalAlignment) GridData/FILL)
  (set! (. grid-data verticalAlignment) GridData/FILL)
  (set! (. grid-data grabExcessHorizontalSpace) true)
  (set! (. grid-data grabExcessVerticalSpace) true))

grid-data のフィールド、horizontalAlignmentverticalAlignment の値を取得するには:

(. instance field-name)

というようなフォームを使います。 set! を使ったサンプルコードでも使われています。
また:

(.field-name instance)

や:

(. field-name instance)

ではないので注意しましょう。

(println (. grid-data horizontalAlignment))

上記のサンプルコードは、grid-data のフィールドの horizontalAlignment の値を出力します。

ビット演算を行うにはどうすればいいの?

SWT では SWT クラスに定義されている定数をビット or でくっつけてコンストラクタに渡すということをよく行います。
この場合は bit-or を使います。

(new Text shell (bit-or SWT/MULTI SWT/BORDER SWT/H_SCROLL SWT/V_SCROLL))

連続で同じインスタンスの違うメソッド呼び出すのめんどいんだけど何とかならないかな?

doto を使いましょう。 doto 内の Java いメソッド呼び出しではレシーバーを指定しなくても呼び出すことができますし、doto の戻り値は第一引数で指定したオブジェクトなので 最初の初期化もラクラクです。

(def shell (doto (new Shell display)
             (.setLayout (new GridLayout))
             (.setText "Demo")))

参考