2012-04-22 4 views
11

私は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の繰り返しだとは思わない。ありがとう!

+0

投稿を編集し、名前空間とマクロを呼び出すClojureのサンプルコードを表示することを検討しますか?私はそれがどんな文脈で使われているのかを見たいと思います。 tnx – octopusgrabbus

+1

もう少し役に立つといいですね。 – jtmoulia

+0

私が得ているエラーは、シンボル:with-nsをこの文脈でコンパイルすることができません。コンパイルですが、関数やマクロの外でwith-nsを使用できるかどうかわかりません。 – octopusgrabbus

答えて

1

まず、この質問は少し古くなっています。昨年、ノワールとクロージャーは進化しました。明確にするために、私はNoirを式から取り除き、マクロを使って動的に関数を作成することについての質問に答えようとします。 REPLに沿っ

フォロー:

$ lein repl 
user=> (in-ns 'foo) 
#<Namespace foo> 
foo=> (clojure.core/refer-clojure) 
nil 
foo=> (defmacro say-hello-to 
#_=>   [name] 
#_=>   `(defn ~(symbol (str "hello-" name)) 
#_=>     [] 
#_=>     ~(str "hello: " name))) 
#'foo/say-hello-to 

ここでは、「ハローyournameの」関数を定義するためのマクロを含む名前空間「foo」を作成します。のは、別の名前空間を作成してみましょう:

foo=> (in-ns 'bar) 
#<Namespace bar> 
bar=> (clojure.core/refer-clojure) 
nil 
bar=> (refer 'foo :only '[say-hello-to]) 
nil 
bar=> (say-hello-to "tom") 
#'bar/hello-tom 
bar=> (say-hello-to "jerry") 
#'bar/hello-jerry 

は、これらが実際に作業している場合を見てみましょう:

bar=> (hello-tom) 
"hello: tom" 
bar=> (hello-jerry) 
"hello: jerry" 

私はこれがあなたの元の例にかなり近いと思います。

希望すると便利です。

関連する問題