一般的な「修正」がどのように見えるかはっきりしないけれども、これは構文見積もりの見落としのように聞こえる(私の意見では)。新しい名前空間から
yummly.mobile-api.main> (in-ns 'foo)
#namespace[foo]
foo> (clojure.core/refer-clojure)
foo> (require '[org.httpkit.client :as client])
nil
foo> (defmacro xxz [& fns]
`([email protected]))
#'foo/xxz
foo> (macroexpand-1 '(xxz client/get))
(client/get)
:
foo> (in-ns 'bar)
#namespace[bar]
bar> (macroexpand-1 '(foo/xxz client/get))
(client/get)
bar> (foo/xxz client/get)
CompilerException java.lang.RuntimeException: No such namespace: client, compiling:(*cider-repl api*:87:6)
構文-引用形式、それはあることだとして(別名 `)は式のすべてのシンボルを見て、ここで
は、より多くの最小限の例です。コンパイルされ、/が見つからない場合、ローカルの名前空間用であるとみなされ、現在の名前空間が追加されます。これは、マクロが定義された時点で実際のマクロに存在するシンボルに対してのみ行うことができます。これは、マクロに引数として渡されるシンボルに対して(私ができるようにするために)できないものです。
マクロで完全な名前空間修飾シンボルを使用すると、名前を使用している人が名前空間内のシンボルへの完全なパスを綴るので、これらのシンボルに何かがマップされていると心配する必要はありません。マクロで使用するシンボルに完全な名前空間を実際に入力しない場合は、ns
式のrequireステートメントに:refer [get]
を使用できます。これにより、名前を入力する必要がなくなります。マクロ定義が評価された時点で正しく名前空間が展開されています。
構文の引用はunhygenicシンボルを生産しているので、あなたはその両方にする必要があります。これらの名前空間は、関数に渡されるすべてのクライアントのためのネームスペースの上部にある機能をごns
セクションでを参照してください:必要か。
もう1つの方法は、シンタックスクォートがコンパイルされたときに、マクロがシンボルを利用できるようにする方法を見つけることです。場合によっては、これは難しいことがあります。
わかりません。 ns "sample"にあり、(xxz ...)を呼び出す場合、ns "sample"は '(:require [some-ns.client:clientとして)']またはそれに類するものを持たなければなりません。 –