1

我正在尝试编写一个将“通用”表达式转换为针对特定给定值评估的表达式的宏。

假设我有一个形式为未计算表达式的向量,

'[(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 表达式上执行。任何帮助表示赞赏。

4

1 回答 1

1

Don't do this with expressions. Instead, use functions. Then it's easy to just call each of the functions with whatever value you want.

于 2012-09-15T21:02:41.273 回答