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
のフィールド、horizontalAlignment
や verticalAlignment
の値を取得するには:
(. 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")))