Trong Common Lisp, tôi có thể xác định và sử dụng một macro để chụp một biến từ phạm vi từ vựng, để tôi có thể sử dụng nó trong một hình thức let
:Cách chụp trong phạm vi từ vựng trong macro Clojure?
CL-USER> (defmacro plus9() `(+ 9 woo))
PLUS9
CL-USER> (macroexpand '(plus9))
(+ 9 WOO)
T
CL-USER> (let ((woo 1)) (plus9))
10
Tuy nhiên, khi tôi định nghĩa một macro tương tự trong Clojure, nó đang tìm kiếm một định nghĩa của woo
trong không gian tên user
:
user=> (defmacro plus9 [] `(+ 9 woo))
#'user/plus9
user=> (macroexpand '(plus9))
(clojure.core/+ 9 user/woo)
user=> (let [woo 1] (plus9))
CompilerException java.lang.RuntimeException: No such var: user/woo
rõ ràng tôi là sự hiểu lầm như thế nào phạm vi hoạt động trong Clojure. Cách chính xác để đạt được vĩ mô này với Clojure là gì?
http://hubpages.com/technology/Unhygenic-anaphoric-Clojure-macros-for-fun-and-profit – coredump
Cú pháp trích dẫn trong Clojure được thiết kế đặc biệt để * tránh các va chạm * của các tên biểu tượng được trích dẫn với các tên có phạm vi từ vựng, trên lý thuyết cho rằng chúng thường không được mong đợi. Như minh họa trong câu trả lời, bạn phải làm thêm công việc nếu đó là những gì bạn đang cố gắng làm. – Alex