Tôi đang cố viết macro ELisp
để tạo nhiều hàm dựa trên một số dữ liệu phổ biến. Ví dụ, khi tôi muốn để tính toán các tên fn tôi viết một cái gì đó tương tự (tôi bỏ qua vệ sinh cho thời điểm này, tôi đi qua một biểu tượng văn chương vào vĩ mô để đánh giá không phải vấn đề):Không thể gọi các hàm được xác định bằng macro với tên được tạo bởi biểu tượng thực hiện
(cl-defmacro def-fns (sym)
"SYM."
(let ((s1 (make-symbol (concat (symbol-name sym) "-1")))
(s2 (make-symbol (concat (symbol-name sym) "-2"))))
`(progn (defun ,s1() (+ 1 2 3))
(defun ,s2() "six"))))
mà tôi mong muốn tạo ra 2 fns khi được gọi, được gọi là foo-1
và foo-2
.
Sau đó tôi sẽ có thể gọi vĩ mô và FNS như vậy:
(def-fns foo)
(foo-1)
;; => 6
(foo-2)
;; -> "six
Ngay cả những macroexpansion của (def-fns foo)
trong Emacs gợi ý rằng đây phải là trường hợp:
(progn
(defun foo-1 nil (+ 1 2 3))
(defun foo-2 nil "six"))
Tuy nhiên, khi Tôi đánh giá định nghĩa def-fns
và gọi nó là không tạo các chức năng đó. Tại sao điều này là trường hợp? Kỹ thuật này hoạt động trong Common Lisp và trong Clojure (có hệ thống macro rất giống nhau), vậy tại sao không trong ELisp?
Thật vậy. Nó đã được một thời gian kể từ khi tôi đã viết bất kỳ CL/Clojure/Elisp phong cách macro và đó là một sai lầm dễ dàng để thực hiện, rõ ràng dễ dàng hơn trong Elisp hơn trong CL :) – jjpe