如何将表达式转换为谓词?(Clojure的)

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)

我想我应该以某种方式使用宏,但我不确定如何.

Ank*_*kur 6

#调用读者宏观和读者宏扩展发生正常宏扩展发生之前.所以要做你提到的事情,你需要使用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)