2009-07-25 29 views
8

Tôi đã thực hành viết macro và tôi dường như không thể nhận được defn để hoạt động.Làm cách nào để viết macro "defn" trong Clojure?

cú pháp của tôi là: (my-define name parameter body)

Lờ đi & thông số và thói quen đệ quy, Làm thế nào để liên kết tên với một (fn [tham số] cơ thể)?

+1

Bạn có thể sử dụng 'macroexpand' để xem trong repl những gì một macro mở rộng đến. Ví dụ. '(macroexpand '(defn foo [] 1))'. Điều này rất hữu ích trong việc gỡ lỗi các macro của riêng bạn, cũng như cố gắng tìm hiểu từ các macro lõi/đinh hương. – liwp

+0

Cũng có thể sử dụng '(nguồn defn)' để trực tiếp kiểm tra mã nguồn. – dqc

Trả lời

18

Bạn sẽ cần phải chuyển đổi

(my-define <name> <args> <body>) 

để

(def <name> (fn <args> <body>)) 

này khá đơn giản thực sự:

(defmacro my-define [name args body] 
    `(def ~name (fn ~args ~body))) 
+2

Điều này không tạo điều kiện cho các chức năng có nhiều biểu mẫu trong nội dung, cũng không phải tài liệu. – acron

+0

Đối với nhiều biểu mẫu, sử dụng toán tử nối (@) -> ~ @ body – MrOerni

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