32

私は clojure のソースを閲覧していて、when マクロの定義方法に驚きました。

user=> (source when)
(defmacro when
  "Evaluates test. If logical true, evaluates body in an implicit do."
  {:added "1.0"}
  [test & body]
  (list 'if test (cons 'do body)))
nil
user=>

代わりに次のように書かれることを期待していました:

(defmacro when [test & body] `(if ~test (do ~@body)))

なぜ実際のマクロはあまり一般的ではない方法で書かれたのでしょうか?

4

1 に答える 1

68

core.clj は、Java が提供するものから始めて、Clojure のすべての要件を徐々に構築していきます。が定義されている場合when、構文引用符はまだ存在しません。マクロはcore.clj の 456 行で定義されており、syntax-quote の要件は 682 行目まで利用できません
whenマクロは、構文の引用を定義するために使用されます。when

于 2012-08-03T23:21:07.137 に答える