我有,我想創建基於作爲參數連同地圖的屬性來記錄實例的類型記錄的新實例的情況下。創建同一類型的記錄作爲另一個
(defn record-from-instance
[other attrs]
;; Code that creates the new record based on "other"
)
我現在所擁有的是在電線之間的東西:
(defn record-from-instance
[other attrs]
(let [matched (s/split (subs (str (class other)) 6) #"\.")
path (s/join "." (pop matched))
class-name (peek matched)]
((resolve (symbol (str path "/" "map->" class-name))) attrs)))
是否有其他更簡單更地道的方式來做到這一點,我不能看?
謝謝!
編輯
給一些更多的細節,我建設有節點被記錄和我使用的是拉鍊參觀,並可能更改/刪除AST的部分的AST。我有一個IZipableTreeNode
協議
(defprotocol IZipableTreeNode
(branch? [node])
(children [node])
(make-node [node children]))
實現了不同類型之間的IZipableTreeNode
是IPersistentMap
IPersistentMap
(branch? [node] true)
(children [node] (seq node))
(make-node [node children]
(let [hmap (into {} (filter #(= (count %) 2)) children)]
(if (record? node)
(record/from-instance node hmap)
hmap)))
當訪問者說,從節點刪除字段(或改變吧)make-node
被調用node
成爲創紀錄的AST節點和children
新的鍵/值對(可能不包含node
中的某些字段)。
真的這整個問題和你對它的所有評論讓我問:「你爲什麼使用記錄?」這聽起來像是你希望記錄的表現完全像地圖一樣,並且你要完成所有這些工作來繞過它們的核心功能。 – amalloy
@amalloy是我使用記錄作爲AST的節點。你會不會更喜歡用帶有_type_字段的簡單地圖呢? – g7s
在說明中添加了一些更多詳細信息 – g7s