Tôi xác định một vĩ mô unless
như sau:Xác định Clojure cú pháp vĩ mô
user=> (defmacro unless [expr body] (list 'if expr nil body))
#'user/unless
user=> (unless (= 1 2) (println "Yo"))
Yo
Như bạn có thể nhìn thấy nó hoạt động tốt.
Bây giờ, trong Clojure một danh sách có thể được định nghĩa theo hai cách:
; create a list
(list 1 2 3)
; shorter notation
'(1 2 3)
Điều này có nghĩa rằng unless
vĩ mô có thể được viết mà không cần từ khóa list
. Tuy nhiên, điều này dẫn đến một ngoại lệ Java bị ném:
user=> (unless (= 1 2) (println "Yo"))
java.lang.Exception: Unable to resolve symbol: expr in this context
Ai đó có thể giải thích tại sao điều này không thành công?
FYI, Clojure đã có các macro tương tự trong lõi, được gọi là 'when-not' và 'if-not'. –