我正在尝试编写一个将“通用”表达式转换为针对特定给定值评估的表达式的宏。
假设我有一个形式为未计算表达式的向量,
'[(map? %)
(-> % :value string?)
(fn[x] (apply #(pos? %) (- x 2))]
我有一个 gensymed 值 v,我希望在运行时将其“传递”给上述表达式。因此,假设 v 将是编译时使用的符号的名称。我还希望断言转换后的表达式。基本上,对于上面的例子,我希望将上面的向量表达式转换成下面的形式。请注意,我在前两个表达式中将值 v 传递给 %,并在第三个表达式中传递给 x。下面的代码不正确,但仅说明了我想要发生的事情。我不知道如何真正让 v 进入以下任何表达式断言。
'[(assert (map? %)) ;; % is equal to v
(assert (-> % :value string?)) ;; % is equal to v
(assert (fn[x] (apply #(pos? %) (- x 2)))] ;; x is equal to v
作为一个指导性的例子,我希望能够在 prepost-map 的 :post 部分做什么?在 defn 表达式上执行。任何帮助表示赞赏。