Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

マルチメソッドで階層的なディスパッチ

More than 5 years have passed since last update.

deriveで階層の設定。::rectは::shapeの子。階層を設定するキーワードは名前空間付きじゃないといけない。

(derive ::rect ::shape)
;=> nil

parents、ancestors、descendants、isa?で階層が設定されていることを確認できる。

(parents ::rect)
;=> #{:user/shape}

mutimethodを定義。
methodのマッチングは=じゃなくてisa?が使われるので階層を設定したキーワードで直接ディスパッチ。

(defmulti bar (fn [x] x))
;=> #'user/bar
(defmethod bar ::shape [x] "shape!")
;=> #<MultiFn clojure.lang.MultiFn@6061b355>

::shapeしか定義していないので ::rect でも ::shape にマッチ。

(bar ::shape)
;=> "shape!"
(bar ::rect)
;=> "shape!"

::rectにも定義するとそっちが呼ばれる。

(defmethod bar ::rect [x] "rect!")
;=> #<MultiFn clojure.lang.MultiFn@6061b355>
(bar ::rect)
;=> "rect!"

ClojureScriptでも大丈夫だった。

参考 Clojure - multimethods

fatrow
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away