Closed ikrima closed 4 years ago
Update: merged feedback below
Adding noprompt feedback from slack here for posterity/to incorporate:
Gotcha. There are two approaches you could apply here. The first one uses a helper to construct the xseg:
(defn make-xseg [val] (m/rewrite val (m/re #"@.*" ?val) {:kind :seg-attr :val ?val} (m/re #"[^@].*" ?val) {:kind :seg-chld :val ?val} ?val {:kind :unknown :val ?val})) (m/rewrite ["oppas" "obj1" "@attr1" "@attr2" "obj2"] [(m/re #"obj|oppas|dc" ?ns) . !segs ...] {:ns (m/keyword ?ns) :xsegs [(m/app make-xseg !segs) ...]}) ;; => {:ns :oppas, :xsegs [{:kind :seg-chld, :val "obj1"} {:kind :seg-attr, :val "@attr1"} {:kind :seg-attr, :val "@attr2"} {:kind :seg-chld, :val "obj2"}]}
The second uses m/cata on the left or right side:
m/cata
;; Left side (m/rewrite ["oppas" "obj1" "@attr1" "@attr2" "obj2"] [(m/re #"obj|oppas|dc" ?ns) . (m/cata !segs) ...] {:ns (m/keyword ?ns) :xsegs [!segs ...]} (m/re #"@.*" ?val) {:kind :seg-attr :val ?val} (m/re #"[^@].*" ?val) {:kind :seg-chld :val ?val} ?val {:kind :unknown :val ?val})
;; Right side (m/rewrite ["oppas" "obj1" "@attr1" "@attr2" "obj2"] [(m/re #"obj|oppas|dc" ?ns) . !segs ...] {:ns (m/keyword ?ns) :xsegs [(m/cata !segs) ...]} (m/re #"@.*" ?val) {:kind :seg-attr :val ?val} (m/re #"[^@].*" ?val) {:kind :seg-chld :val ?val} ?val {:kind :unknown :val ?val})
(m/rewrite ["oppas" "obj1" "@attr1" "@attr2" "obj2"] [(m/re #"obj|oppas|dc" ?ns) . !segs ...] {:ns (m/keyword ?ns) :xsegs [(m/cata ($EXAMPLE !segs)) ...]} ($EXAMPLE (m/re #"@.*" ?val)) {:kind :seg-attr :val ?val} ($EXAMPLE (m/re #"[^@].*" ?val)) {:kind :seg-chld :val ?val} ($EXAMPLE ?val) {:kind :unknown :val ?val}) ;; => {:ns :oppas, :xsegs [{:kind :seg-chld, :val "obj1"} {:kind :seg-attr, :val "@attr1"} {:kind :seg-attr, :val "@attr2"} {:kind :seg-chld, :val "obj2"}]}
This looks great. Thanks!
Update: merged feedback below
Adding noprompt feedback from slack here for posterity/to incorporate:
Gotcha. There are two approaches you could apply here. The first one uses a helper to construct the xseg:
The second uses
m/cata
on the left or right side: