2016-10-20 6 views
1

Clojureのマクロに名前空間解像度を行う方法:私のようなマクロを持って

例:

(defmacro xxz [& fns] `(:body [email protected](map (fn [[e1 e2]] `(~e2 "http://www.google.com")) fns))) 

私は(xxz [client/get client/get])ようなものを渡すと、結果のmacroexpandはシンボルが適格ではなかったことを示しています。

(:body (client/get "http://www.google.com"))

このような何かを持っていない名前空間に着地するときに問題が発生しclientをインポートしました。

誰も知らないのですか?

+0

わかりません。 ns "sample"にあり、(xxz ...)を呼び出す場合、ns "sample"は '(:require [some-ns.client:clientとして)']またはそれに類するものを持たなければなりません。 –

答えて

2

一般的な「修正」がどのように見えるかはっきりしないけれども、これは構文見積もりの​​見落としのように聞こえる(私の意見では)。新しい名前空間から

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つの方法は、シンタックスクォートがコンパイルされたときに、マクロがシンボルを利用できるようにする方法を見つけることです。場合によっては、これは難しいことがあります。

+0

'マクロで名前空間修飾されたシンボルを使用しているので(あなたがそうしなければならない)、人々があなたのマクロを使用する名前空間にこれらのシンボルがマップされていれば心配する必要はありません。それは名前です」 - これはまさに問題です。何らかの理由でこの場合、私はシンボルへの完全な道を得ていません。私は正しい完全修飾シンボルである 'clj-http.core/get'の代わりに' client/get'シンボルをmacroexpandに入れます。したがって、私の質問:なぜそれは修飾されていないのですか? –

+0

それは本当に構文引用のバグのように思えます。その方法で動作するはずではありません –

+0

これはClojure Jiraの問題追跡ツール –

関連する問題