Ich versuche ein ELisp
Makro zu schreiben, um eine multiple Funktionen basierend auf einigen gemeinsamen Daten zu generieren. Zum Beispiel, wenn ich die fn Namen berechnen möchte ich schreibe so etwas wie (ich ignoriere Hygiene für den Moment bin ich vorbei ein Symbol wörtliche in das Makro so Auswertung sollte keine Rolle spielen):Kann nicht Funktionen im Makro mit Namen von make-Symbol definiert aufrufen
(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"))))
was erwarte ich 2 fns zu erzeugen, wenn sie aufgerufen werden, genannt foo-1
und foo-2
.
Ich soll dann in der Lage sein, die Makro- und FNS wie so aufzurufen:
(def-fns foo)
(foo-1)
;; => 6
(foo-2)
;; -> "six
Auch die macroexpansion von (def-fns foo)
in Emacs legt nahe, dass dies der Fall sein sollte:
(progn
(defun foo-1 nil (+ 1 2 3))
(defun foo-2 nil "six"))
Wenn jedoch Ich werte die def-fns
Definition aus und rufe sie auf nicht erzeuge diese Funktionen. Warum ist das der Fall? Diese Technik funktioniert in Common Lisp und in Clojure (die sehr ähnliche Makrosysteme haben), also warum nicht in ELisp?
In der Tat. Es ist eine Weile her, seit ich irgendwelche CL/Clojure/Elisp-Stil-Makros geschrieben habe und es ist ein leichter Fehler, es zu machen, anscheinend sogar einfacher in Elisp als in CL :) – jjpe