Ste*_*gle 5 expression predicate clojure
鉴于我有一个表达形式
'(map? %)
Run Code Online (Sandbox Code Playgroud)
我如何将其转换为类似的东西
'#(map? %)
Run Code Online (Sandbox Code Playgroud)
所以我最终可以把它扩展成类似的东西
'(apply #(map? %) value)
Run Code Online (Sandbox Code Playgroud)
我想我应该以某种方式使用宏,但我不确定如何.
该#调用读者宏观和读者宏扩展发生正常宏扩展发生之前.所以要做你提到的事情,你需要使用read-string如下所示的宏中的阅读器.
(defmacro pred [p v]
(let [s# (str \# (last p))]
`(apply ~(read-string s#) ~v)))
user=> (pred '(map? %) [{}])
true
user=> (pred '(map? %) [[]])
false
Run Code Online (Sandbox Code Playgroud)
如果数据(即谓词表达式)在运行时可用,那么您需要使用一个函数(它比宏更灵活).
(defn pred [p v]
(let [s (read-string (str \# p))]
(eval `(apply ~s ~v))))
user=> (map #(pred % [12]) ['(map? %)'(even? %)])
(false true)
Run Code Online (Sandbox Code Playgroud)