2011-12-03 19 views
8

Macro Noirdefpage mang đến cho tôi một chút rắc rối. Tôi cố gắng để xây dựng một cuộc gọi tương tự như sau:Biến được chuyển đến macro được giải quyết trong không gian tên sai?

(defpage [:post "some/url"] [data] 
    ;; some stuff... 
) 

Tuy nhiên, thay vì sử dụng các từ khóa :post Tôi muốn sử dụng một biến, như thế này:

(def my-method :post) 
(defpage [my-method "some/url"] [data] 
    ;; some stuff... 
) 

Vấn đề là khi nở vĩ mô, nó muốn giải quyết biến my-method trong không gian tên compojure.core thay vì của riêng tôi, cho tôi những lỗi:

No such var: compojure.core/MY-METHOD 

Làm thế nào c một lực lượng my-method để giải quyết trong ngữ cảnh hiện tại?

Trả lời

1

Tôi đoán đây là một vấn đề tương tự: How can I apply clojure's doc function to a sequence of functions Macro có thể làm bất cứ điều gì nó muốn với args của nó một biểu tượng khỏa thân trong có thể dẫn đến kết quả không thể đoán trước.

Một cách để giải quyết nó, nhưng nó không phải là khá:

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

Chú ý rằng, phương pháp của tôi không phải là một nghĩa đen ở đây, vì vậy nó được giải quyết và đánh giá trong không gian tên riêng của chúng tôi đầu tiên, trước khi đi vào eval

0

gì về truyền my-phương pháp cùng với không gian tên nó là:

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

Tôi đã thử điều đó, nhưng dường như nó không hoạt động. – benekastah

1

Dường như, noir đó không có nghĩa là sẽ được sử dụng theo cách này, vì nó cần đối số phương pháp và biến đổi nó vào biểu tượng trong compojure.core (xem https://github.com/ibdknox/noir/blob/master/src/noir/core.clj#L36). Nó có nghĩa là, nó không mong đợi một biến ở nơi này, chỉ có chữ. Vì vậy, tôi không nghĩ rằng bạn có thể làm bất cứ điều gì về điều đó, ngoại trừ việc đăng một vấn đề cho noir ...

1

Nếu chúng ta xem qua tập tin noir/core.clj (source), tìm hàm phân tích cú pháp và lý do nó hoạt động với đối số phương thức của nó (nó được gọi là hành động), chúng ta có thể thấy từ khóa phương thức được chuyển thành chuỗi , trên và được giải quyết trong không gian tên compojure.core. Tất cả điều này được thực hiện trong thời gian mở rộng macro. Vì vậy, không thể sử dụng biến thay vì từ khóa mà không thay đổi mã noir.

Các vấn đề liên quan