deftype:Clojureでのmutableなデータのハンドリング

ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 自然言語処理技術 セマンティックウェブ技術 深層学習技術 オンライン学習&強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 推論技術  Clojure プログラミング

Clojureでのクラスのハンドリングの関数として、defrecorddefTypeがある。deftypeに関してはmutableな変数を扱う使い方がある。以下にまとめる。まずはdefinterfaceを用いたパターン。

(definterface IPoint
  (getX [])
  (setX [v]))

(deftype Point [x]
  IPoint
  (getX [this] x)
  (setX [this v] (set! (.x this) v)))

(def p (Point. 10))

(.getX p)
;;-> 10
(.setX p 20)
;;->20
(.getX p)
;;->20

古いサンプルだとdeftypeのxの設定で” [^{:volatile-mutable true} x]”とmutableの変数として設定しないと動作しないとあったが1.10の現在では、そのような設定をしなくとも動作する。

次にdefprotocolを用いた例を示す。

(defprotocol IPoint2
  (getX [this])
  (setX [this val]))

(deftype Point2 [^{:volatile-mutable true} x]
  IPoint2
  (getX [_] x)
  (setX [this v] (set! x v)))

(def p2 (Point. 10))

(.getX p2)
;;-> 10
(.setX p2 20)
;;->20
(.getX p2)
;;->20

同様に動作する。最後に複数のプロトコルを設定した例を示す。

(defprotocol IPoint3
  (getX1 [this])
  (setX1 [this val])
  (getX2 [this])
  (setX2 [this val]))

(deftype Point3 [^{:volatile-mutable true} x
          ^{:volatile-mutable true} y]
   IPoint3
   (getX1 [_] x)
   (setX1 [this v] (set! x v))
   (getX2 [_] y)
   (setX2 [this v] (set! y v)))

(def p3 (Point3. 10 20))

(.getX1 p3)
;;-> 10
(.setX1 p3 "hello")
;;->"hello"
(.getX1 p3)
;;-> "hello"

となり、mutableなクラスデータを構成する事ができる。

コメント

  1. […] deftypeでのミュータブルなデータのハンドリング […]

タイトルとURLをコピーしました