11

X.clojurescriptとX.clojure名前空間があるとしましょう。X.clojurescriptのすべてがClojurescriptコードであり、X.clojureのすべてがClojureコードです。残念ながら、Clojurescriptでマクロを直接定義することはできません。マクロをClojureで定義してから、を使用してマクロをClojurescript名前空間に取り込む必要があります。

(ns X.clojurescript.abc
  (:require-macros [X.clojure.def :as clj]))

これで結構です。ただし、マクロ(X.clojureで定義されている)がClojurescript名前空間(X.clojurescript)で定義されているものを参照する必要がある場合はどうなりますか?問題は、他の名前空間を解決するときに、Clojureコンパイラが私のClojurescript名前空間(別のディレクトリ)を検索しないことです。

Clojurescriptに存在するのと同じ名前空間と必要な定義を持つ名前空間をClojureコードに作成するだけでこの問題を回避できましたが、これはちょっとばかげているようです。したがって、たとえば、マクロにX.clojurescript.abc.yが必要な場合は、ClojureバージョンのX.clojurescript.abcでダミーのyを定義する追加の名前空間をClojure側に作成します。ちょっとばかげている。

Clojurescript側で何かを参照する必要があるマクロをどのように処理しますか?

4

1 に答える 1

6

マクロが定義時に特定の名前空間を必要とするのは、マクロがその名前空間のコードを使用して、返されるシンボルのリストを生成する場合のみです。

repl でこれらの例をたどることができます。

(defmacro foo
  [a]
  `(bar/bar ~a))

bar が名前空間として定義されていなくても、foo の定義はコンパイルされます。

(foo :a)

bar 名前空間または関数 bar をまだ定義していないため、foo の呼び出しは失敗します。

(ns bar)
(defn bar
  [x]
  [x x])

bar 名前空間で bar を定義します

(ns user)
(foo :a)

=> [:a:a]

foo の定義時に bar が存在する必要がないことに注意してください。実際、名前空間は foo の定義時に存在する必要さえありません。

于 2013-05-13T13:56:05.097 に答える