8

Noirマクロdefpageは私に少し問題を与えています。私はこれに似た呼び出しを作成しようとしています:

(defpage [:post "some/url"] [data]
  ;; some stuff...
  )

ただし、キーワード:postを使用する代わりに、次のような変数を使用したいと思います。

(def my-method :post)
(defpage [my-method "some/url"] [data]
  ;; some stuff...
  )

問題は、マクロが展開されるときに、自分の変数ではなく名前空間の変数を解決しようとしmy-methodcompojure.coreエラーが発生することです。

No such var: compojure.core/MY-METHOD

my-method現在のコンテキストで強制的に解決するにはどうすればよいですか?

4

4 に答える 4

1

noirはメソッド引数を取り、それをのシンボルに変換するため、このように使用することを意図していないようですcompojure.corehttps://github.com/ibdknox/noir/blob/master/src/noir/coreを参照) .clj#L36)。つまり、この場所では変数を期待せず、リテラルのみを期待します。だから私はあなたがそれについて何もできないと思いますが、noirに問題を投稿することを除いて...

于 2011-12-04T08:52:37.637 に答える
1

これは次のような問題だと思います。clojureのdoc関数を一連の関数に適用するにはどうすればよいですか 。マクロは引数を使ってやりたいことを何でもできるので、裸のシンボルを渡すと予期しない結果になる可能性があります。

それを解決する方法ですが、それはきれいではありません:

(eval (list 'defpage (vector my-method "some/url") '[data]
  ; some stuff
))

my-methodはここではリテラルではないため、evalに入る前に、まず独自の名前空間で解決および評価されることに注意してください。

于 2011-12-04T08:54:29.093 に答える
1

noir / core.cljファイル(ソース)を調べて、parse-route関数を見つけ、そのメソッド引数(そこではアクションと呼ばれます)で何をするかを推論すると、メソッドキーワードが文字列に変換され、大文字で解決されていることがわかりますcompojure.core名前空間内。これはすべて、マクロ展開時に行われます。したがって、noirコードを変更せずに、キーワードの代わりに変数を使用することはできません。

于 2011-12-04T09:02:53.527 に答える
0

my-methodを名前空間と一緒に渡すのはどうですか?

(defpage [myns/my-method "some/url"] [data]
;;
)
于 2011-12-04T08:51:15.737 に答える