まず、私はClojureを初めて使用するので、これはばかげた質問になる可能性があります。
学習演習として、私は些細なテキストアドベンチャーマルチメソッドシステムを機能させています。ここで、キーワードの使用から、「sack」、「sword」などの個々のインスタンスに関連するデータを保持できる「classiness」の形式に変更したいと思います。
defrecord
ここに行く方法はありますか?
質問:Clojureの派生を使用して、defrecordクラスタイプの階層を作成できますか?これに似ているように見えますが、受け入れられた答えは「いいえ、おそらくインターフェースを使用してください」と言っています。
答えは本当にノーですか?Clojureのマルチメソッドを使用するには、すべてのデータ表現をJavaクラスとして記述する必要がありますか?
ありがとう、
クリス。
作業コード:
(derive ::unlit_root ::room)
(derive ::room ::thing)
(derive ::item ::thing)
(derive ::sword ::item)
(derive ::container ::thing)
(derive ::sack ::container)
(derive ::sack ::item)
(derive ::wardrobe ::furniture)
(derive ::furniture ::thing)
(derive ::wardrobe ::furniture)
(defmulti put (fn [x y z] [x y z]))
(defmethod put [::room ::thing ::thing] [x y z] "you can only put items into containers")
(defmethod put [::room ::sword ::sack] [x y z] "the sword cuts the sack")
(defmethod put [::room ::item ::container] [x y z] "ordinary success")
(defmethod put [::unlit_room ::thing ::thing] [x y z] "it's too dark, you are eaten by a grue")
(defmethod put [::room ::sack ::wardrobe] [x y z] "you win")
(defmethod put [::room ::item ::sack] [x y z] "you put it in the sack")
(defmethod put [::room ::furniture ::thing] [x y z] "it's too big to move")
以下は私がこれまでに試したことですが、最初はエラーが発生しますderive
:
ClassCastException java.lang.Class cannot be cast to clojure.lang.Named clojure.core/namespace (core.clj:1496)
。
(defrecord Item [name])
(defrecord Weapon [name, damage])
(defrecord Furniture [name])
(defrecord Container [name])
(defrecord Bag [name])
(derive Weapon Item)
(derive Container Item)
(derive Bag Container)
(derive Furniture Container)
(def sword (Weapon. "sword" 10))
(def apple (Item. "apple"))
(def cupboard (Furniture. "cupboard"))
(def bag (Bag. "bag"))
(defmulti putin (fn [src dst] [src dst]))
(defmethod putin [Item Container] [src dst] :success_0)