Tôi muốn macro xác định các hàm trả về biểu mẫu mà chúng được gọi là, ví dụ: (func 1 (a b))
trả lại (func 1 (a b))
. Tôi cũng muốn cho phép xác minh đầu vào cho các chức năng này để đảm bảo rằng tôi không giới thiệu bất kỳ lỗi nào. (Các biểu mẫu này sau đó sẽ được đánh giá, nhưng mã đó vẫn chưa được viết.)Xác định hàm trong macro: không thể sử dụng tên đủ điều kiện làm tham số
Tôi vẫn gặp lỗi này.
(defmacro defecho
"Echo function call after asserting a few things about the input"
([f] `(defecho ~f nil nil))
([f assertions] `(defecho ~f assertions nil))
([f assertions assert-failed-message]
`(defn ~f [& body] ; define a function
~(when-not (nil? assertions) ; if given a function for input validation
`(assert (~assertions body) ; define the function to assert this as true
~assert-failed-message)) ; with a given error message
(conj body (quote ~f))))) ; return the (f [email protected]) list
(defecho my-test
#(< 2 (count %))
"Must be greater than zero")
Unhandled clojure.lang.Compiler$CompilerException Error compiling: /private/var/...228.clj:1:1 Can't use qualified name as parameter: my-test/body
Caused by java.lang.RuntimeException Can't use qualified name as parameter: my-test/body
Bạn cũng có thể sử dụng cú pháp 'body #' để tự động gensym tên. – drnewman
@drnewman Vì ví dụ này sử dụng 'body #' trong hai bối cảnh cú pháp trích dẫn khác nhau, các ký hiệu khác nhau sẽ được tạo ra. –
Leon Grapenthin, bạn nói đúng, cảm ơn vì đã sửa – drnewman