可以在clojure中使用defmacro配额参数吗?

时间:2014-05-22 12:43:59

标签: clojure

我有一个将评估为true或false的字符串,我可以使用宏并将字符串作为参数传递吗?我写了以下内容,但结果是(= 0 0)而不是true的字符串。如何获得真实的结果?

(def a "(= 0 0)")

(defmacro test [code-string]  code-string)

(test a)

更新: 目的是替换动态SQL。目前,我们存储的代码类似于' column_a> 1'在数据库中,然后我们将获得代码,并组装一个像

这样的SQL
select case when column_a>1 then 0 else 1 end as result from table 

有很多这样的代码,我希望并行使用clojure来加速它。要使用clojure,我可以存储'(> row [" column_a"] 1)'在数据库中,然后在jdbc循环中,调用(> row [" column_a"] 1)来执行我的逻辑,比如在数据库中存储一些代码段并需要运行它。

3 个答案:

答案 0 :(得分:1)

不,您不能直接使用字符串作为代码。 Defmacro采用s表达式而不是字符串。 Clojure可能有类似read的东西,它可以解析一个字符串并从中创建一个s表达式,然后你就可以通过类似eval之类的代码来执行它。

通常没有充分的理由把代码放在字符串或其他数据结构中,无论如何都会在程序执行中存在,试着只使用一流的函数。或者提到你想要解决的确切问题,人们可能会给出更好的答案。这可能是XY problem

的一个实例

注意:我不知道Clojure,但所有这些都是Lisp-generic。

答案 1 :(得分:1)

正如TaylanUB已经说过的,Clojure提供eval来评估运行时的某些表达式。但是,除非你有充分的理由使用它,否则使用eval是不受欢迎的。目前还不清楚你真正打算做什么,所以提供一个更真实的例子是有帮助的。如果您没有,则不需要eval。 类似地,宏用于转换代码并且不在运行时运行,而是运行宏评估的代码。典型的方法是尝试用单纯的函数来解决问题,只有当宏会根据对更广泛代码的适用性给你一些东西,考虑将代码转换为宏。 编辑:看看Clojure中对宏的一些介绍,例如:这部分来自Clojure from the ground up

答案 2 :(得分:0)

(defn eval-code [code-string]
  (eval (read-string code-string)))

(eval-code "(= 0 0)")

;;你不需要宏。

相关问题