2011-12-03 44 views
8

Noirdefpage給我一點麻煩。我試圖建立類似這樣的電話:傳遞給宏的變量在錯誤的名稱空間中解析?

(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在當前上下文中解決?

回答

1

我想這是一個類似的問題:How can I apply clojure's doc function to a sequence of functions 宏可以做任何想要的任何它的參數,所以通過一個赤裸的符號可能會導致不可預知的結果。

辦法去解決它,但它並不漂亮:

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

發現我的法是不是在這裏字面,所以纔去得到解決,並首先在我們自己的命名空間進行評估, EVAL。

0

關於通過我的法一起的命名空間是什麼:

(defpage [myns/my-method "some/url"] [data] 
;; 
) 
+0

我試過了,但它似乎沒有工作。 – benekastah

1

看來,那黑色並不意味着使用這種方式,因爲它需要方法參數,並將其轉換爲符號在compojure.core(見https://github.com/ibdknox/noir/blob/master/src/noir/core.clj#L36)。這意味着,它不指望在這個地方的變量,只有文字。所以我不認爲你可以做任何事情,除了發佈到黑色的問題...

1

如果我們看通過黑色/ core.clj文件(source),發現解析,路由功能和目的是什麼它與它的方法說法有(它被稱爲動作那裏),我們可以發現,方法關鍵字轉換爲字符串,大寫並在compojure.core命名空間中解析。所有這些都是在宏擴展時完成的。因此,如果不更改noir代碼,就不可能使用變量而不是關鍵字。

相關問題