2012-08-11 2 views
4

저는 clojure와 웹 개발 스택에 새로운 브랜드입니다. 이건 내 두 HTML 요소를 설정하기 위해 잘 작동deftemplate에서 로컬 변수 바인딩을 사용하여 확대하기

(en/deftemplate project-main-page 
    (en/xml-resource "project-main.html") 
    [id] 
    [:#project-name] (en/content (str "Name: " ((get-project id) :name))) 
    [:#project-desc] (en/content (str "Desc: " ((get-project id) :desc)))) 

하지만 내 기능 get-project에 반복 호출을 포함한다 : 나는 HTML 템플릿에 값을 설정하는 enlive 사용하는 것을 시도하고있다. 이 순간에 로컬 맵에서 읽지 만 결국에는 외부 저장소 액세스가 필요하므로이 함수에서 한 번만 수행하는 것이 좋습니다.

(en/deftemplate project-main-page 
    (en/xml-resource "project-main.html") 
    [id] 
    (let [project (get-project id)] 
    [:#project-name] (en/content (str "Name: " (project :name))) 
    [:#project-desc] (en/content (str "Desc: " (project :desc))))) 

을하지만 이것은 단지 설명 요소에 영향을 미치고 이름 양식을 무시 :

나는 let를 사용하는 생각을했다.

deftemplate 내에 로컬 변수를 바인딩하는 가장 좋은 방법은 무엇입니까?

+0

이 deftemplate에'macroexpand'을 실행 해,이 정보를 수 무엇을해야 할 다른 방법을 전달 바랍니다. – dimagog

답변

1

확대의 deftemplate 매크로는 args 벡터 다음에 일련의 태그/내용 쌍이 필요합니다 (예를 들어 args 벡터가 [id]). 매크로는 let 형식을 기대하지 않기 때문에 let을 붙일 수 없습니다. 연결을 수행하면 모든 것이 엉망이되어 위에서 설명한 동작이 발생합니다.

이 문제를 해결할 수있는 방법 중 하나는 args 벡터의 식별자를 사용하여 바인딩 정의를 허용하는 deftemplate 매크로를 작성하는 것입니다. 예 :

(alt/deftemplate project-main-page 
    (en/xml-resource "project-main.html") 
    [id] 
    [project (get-project id)] 
    [:#project-name] (en/content (str "Name: " (project :name))) 
    [:#project-desc] (en/content (str "Desc: " (project :desc)))) 

deftemplate 매크로 snippet*를 사용하는 간단한 래퍼 주위 template이고,이 변경 사항 삽입해야 할 위치 아마도 :

(defmacro snippet* [nodes args & forms] 
    `(let [nodes# (map annotate ~nodes)] 
    (fn ~args 
     ; You could add let bindings here since args are in scope 
     (doall (flatmap (transformation [email protected]) nodes#))))) 

을 옵션 - 이는 다른 수 있습니다 라이브러리 코드에서 주위를 둘러 볼 필요가 없기 때문에 더 간단합니다. get-project 함수에 간접 레벨을 추가하여 결과를 캐시하는 것입니다. core.cache 라이브러리를 사용해보십시오.

+0

필요하다면'deftemplate'과'snippet *'매크로를 업데이트했습니다 (테스트되지는 않았지만).하지만 직접 변경을하고 매크로에 대해 더 배우는 기회는 빼앗기지 않을 것입니다! – DaoWen

+0

감사합니다. 나는 아직도 막 배우기 시작했고 아직 매크로 구문에 대해 머리를 쓰지 않고있다. 나는 가서 내가 무엇을 생각해 낼 수 있는지 알아볼 것이다. – DCWoods

+0

매크로는 처음에는 다소 미친 듯하지만 일단 구문 견적을 둘러 보면 나쁘지 않습니다. 그냥 돌아와서 당신이 생각 나게하는 것을 잊지 마세요! :디 – DaoWen

2

달성하려는 내용을 이해 한 경우; 당신은 또한 확대로 제공되는 변형 매크로를 사용해 볼 수 있습니다.

(defn main-page [{:keys [name desc] :as project}] 
(en/transformation 
    [:#project-name] (en/content (str "Name: " name) 
    [:#project-desc] (en/content (str "Desc: " desc)))) 


(en/deftemplate project-main-page 
    (en/xml-resource "project-main.html") 
    [id] 
    (main-page (get-project id))) 

코드는 테스트되지 않은,하지만 난 당신이