(ns nal.deriver.utils (:require [clojure.walk :as w])) | |
Checks if element is not operator | (defn not-operator? [el] (re-matches #"[akxA-Z$]" (-> el str first str))) |
(def operator? (complement not-operator?)) | |
Macro that helps to replace elements during walk. The first argument is collection, rest of the arguments are cond-like expressions. Default result of cond is element itself. el (optionally :el) is reserved name for current element of collection. | (defmacro walk
[coll & conditions]
(let [el (gensym)
replace-el (fn [coll]
(w/postwalk #(if (or (= 'el %) (= :el %)) el %) coll))]
`(w/postwalk
(fn [~el] (cond ~@(replace-el conditions)
:else ~el))
~coll))) |