3

私はclojureマクロを「取得」しare、既存のareマクロに関してマクロの微調整バージョンを書き込もうとしています。 私が欲しい微調整は、[argv expr args]代わりに署名をすることです。[argv expr & args]

(defmacro are2 [argv expr args] `(clojure.test/are ~arg ~expr ~@args))

引用符で囲まれていないリストを期待する場合を除いて、どの種類の作品ですか。

(are2 [input] (= 0 input) (1 2 3))

引用符で囲まれたリストを期待したい場合:

(are2 [input] (= 0 input) '(1 2 3))

しかし、その結果は次のようになります。

Unable to resolve symbol: quote in this context.

やってみたら

(are2 [input] (= 0 input) (list 1 2 3))

代わりに、listそれ自体がテストケースとして処理されます。

私が理解していないこと/マクロの見積もりをどのように乗り越えることができますか

4

1 に答える 1

5

'(1 2 3)(quote (1 2 3))余分なquoteシンボルと、macroexpand-1 で確認できるリストのレベルが 1 つ多すぎる展開です。

user> (macroexpand-1 '(are2 [input] (= 0 input) '(1 2 3)))
(clojure.test/are [input] (= 0 input) quote (1 2 3)) 

リストから引用符を削除するには、最初にintでラップして残ります

 user> (defmacro are2 [argv expr args] 
          `(clojure.test/are ~argv ~expr ~@(first (rest args))))
#'user/are2
user> (macroexpand-1 '(are2 [input] (= 0 input) '(1 2 3)))
(clojure.test/are [input] (= 0 input) 1 2 3) 

次に、テストとして実行されます。

user> (are2 [input] (= 0 input) '(1 2 3)

FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
expected: (= 0 1)
  actual: (not (= 0 1))

FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
expected: (= 0 2)
  actual: (not (= 0 2))

FAIL in clojure.lang.PersistentList$EmptyList@1 (NO_SOURCE_FILE:1)
expected: (= 0 3)
  actual: (not (= 0 3))
false 
于 2013-02-14T22:20:02.767 に答える