如何将“通用”表达式转换为断言谓词表达式? (Clojure的)

时间:2012-09-15 17:20:40

标签: clojure contract

我正在尝试编写一个宏,将“泛型”表达式转换为针对特定给定值计算的表达式。

让我们说我有一个未经评估的表格形式的载体,

'[(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的一部分?做一个明确的表达。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

请勿使用表达式执行此操作。相反,使用功能。然后很容易用你想要的任何值调用每个函数。