2012-04-22 3 views
11

나는 noir webapp을 만들고 있는데, 새로운 뷰와 모델을 동적으로 생성해야한다. 나는 자원에 대한 뷰와 컨트롤러가 별도의 네임 스페이스를 가지고있는 느와르 예제를 따라 왔으며, 매우 깨끗한 접근 방식이라고 생각했다. 이과 유지에동적으로 생성 된 네임 스페이스에 함수를 추가하는 명확한 방법이 있습니까?

, 나는 동적으로의 뷰와 모델, 그리고 인턴 적절한 기능에 해당하는 새 네임 스페이스를 만들 수 있어야합니다. 내 생각은 매크로를 별도의 네임 스페이스에 지정하여 새 네임 스페이스에서 호출 할 때 적절한 경로/부분/기타를 제공하는 것이 었습니다. 예를 들어

(첫 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"]))) 

가 호출 ...

(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) 

그러나, 나의 새로운 네임 스페이스 내에서 이것을 호출하면 나에게 NullPointerException이 있습니다. 저는 어떤 도움을 주셔서 감사 드리며, 더 나은 접근 방법이 있는지 없는지 잘 알고 있습니다. 마찬가지로 필요한 정의가 모두 포함 된 네임 스페이스를 참조하는 것만 큼?

첫 번째 게시물, 그리고 나는 그것이 this의 반복 생각하지 않습니다. 감사! 모든

+0

당신은 귀하의 게시물을 편집하고 이름 공간과 매크로를 호출 일부 샘플 Clojure의 코드를 나타내는 고려겠습니까? 나는 그것이 사용 된 문맥을보고 싶다. tnx – octopusgrabbus

+1

좀 더 도움이되기를 바랍니다. – jtmoulia

+0

내가 얻는 오류는 symbol : 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=> (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" 

을 나는이 원래의 예에 아주 가까이 생각합니다.

희망이 도움이됩니다.