3

次のマクロがあります。

(defmacro ss [x]

`(clojureql.core/select 
      (clojureql.core/table db "users_table")
      (clojureql.core/where  ~x)
  )
)

(macroexpand '(ss '(= :type "special")))

:しかし、それは生成します:

(clojureql.core/select (clojureql.core/table oe.db.dbcore/db "users_table") (clojureql.core/where '(= :type "special"))) 

: それ以外の :

(clojureql.core/select (clojureql.core/table oe.db.dbcore/db "users_table") (clojureql.core/where (= :type "special"))) 

: 問題は、リスト '(= :type "special") を渡していることですが、これをマクロで引用符から外すにはどうすればよいでしょうか?

アップデート:

これを行うことによるミケラの答えのおかげで、私は最終的にこれを機能させました:

(defn ss [x]

  (clojureql.core/select 
      (clojureql.core/table db "users_table")
      x
  )


)

(macroexpand '(ss (eval `(clojureql.core/where ~'(= :type "special")))))

: 出力はわずかに異なりますが、期待どおりに動作します。

(ss (eval (clojure.core/seq (clojure.core/concat (clojure.core/list 'clojureql.core/where) (clojure.core/list '(= :type "special")))))) 
4

2 に答える 2

3

あなたがmacroexpandに間違ったものを渡しているように私には見えます:あなたはおそらく以下を使うべきです:

(macroexpand '(ss (= :type "special")))

つまり、式全体を引用するには、最初に1つの引用符が必要です。

于 2011-07-07T19:40:02.287 に答える
2

前者は-well-runtimeでのみ認識され、後者は-well-コンパイル時にすでに展開およびコンパイルされているため、実行時引数をマクロに渡すことはできません。

関数を使用する必要があります。

(defn get-users-by-type
  [t]
  (cql/select
    (cql/table db "users_table")
    (cql/where (= :type t))))
于 2011-07-08T07:24:53.363 に答える