私はnoir webappを作成しています。新しいビューとモデルを動的に作成する必要があります。私は、リソースのビューとコントローラが別々の名前空間を持つ、noirの例に従ってきました。私はそれを非常にきれいな方法であると見出しました。動的に作成された名前空間に関数を追加する明確な方法はありますか?
これに合わせて、ビューとモデルに対応する新しい名前空間を動的に作成してから、適切な関数をインターンにする必要があります。私の考えは、新しい名前空間で呼び出されたときに、適切なルート/部分/その他を提供する別の名前空間にマクロを指定することでした。例えば
(私の最初のdefmacroを許す):
(ns project.views.proto
(:use noir.core
hiccup.core
hiccup.element
hiccup.form))
(defmacro def-all-page
[path]
`(defpage ~path []
(html
[:h1 "Ya'll here"])))
はしかし、私の新しい名前空間内からこれを呼び出すと、私にNullPointerExceptionが与え
(ns project.proto
(:use [clojure.contrib.with-ns :only [with-ns]])
(create-ns 'foo)
(intern 'foo 'path "path") ; In reality, the path is dynamic which is why I intern it
(with-ns 'foo
(clojure.core/refer-clojure)
(use 'noir.core
'hiccup.core
'hiccup.element
'[project.views.proto :only [def-all-page]])
(def-all-page path)
...から呼び出されます。私は、どんな助けもあり、よりよいアプローチがあるかどうかに大いに感謝しています。同様に、すべての必要な定義を含む名前空間を参照するだけですか?
最初の投稿、私はそれがthisの繰り返しだとは思わない。ありがとう!
投稿を編集し、名前空間とマクロを呼び出すClojureのサンプルコードを表示することを検討しますか?私はそれがどんな文脈で使われているのかを見たいと思います。 tnx – octopusgrabbus
もう少し役に立つといいですね。 – jtmoulia
私が得ているエラーは、シンボル:with-nsをこの文脈でコンパイルすることができません。コンパイルですが、関数やマクロの外でwith-nsを使用できるかどうかわかりません。 – octopusgrabbus