ウェブ技術 デジタルトランスフォーメーション技術 人工知能技術 自然言語処理技術 セマンティックウェブ技術 深層学習技術 オンライン学習&強化学習技術 チャットボットと質疑応答技術 ユーザーインターフェース技術 知識情報処理技術 推論技術 Clojure プログラミング
Clojureでのクラスのハンドリングの関数として、defrecordとdefTypeがある。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なクラスデータを構成する事ができる。
コメント
[…] deftypeでのミュータブルなデータのハンドリング […]