Ich arbeite an der Optimierung meiner Emacs-Konfiguration, in der ich dynamisch interaktive Funktionen für alle Themen erstellen kann, die ich in einer Liste habe.
Unten finden Sie eine vereinfachte Version des Konstrukts, mit dem ich arbeiten möchte.
;; List containing names of functions that I want to create
(setq my/defun-list '(zz-abc
zz-def
zz-ghi))
;; Elisp macro to create an interactive defun whose name
;; is passed as the macro argument
(defmacro my/create-defun (defun-name)
`(defun ,defun-name ()
(interactive)
(let ((fn-name (symbol-name ',defun-name)))
(message "Testing creation of function %s" fn-name))))
;; Loop to call the above macro for each element in the list
;; DOES *NOT* WORK
(dolist (name my/defun-list)
(my/create-defun name))
Aber wenn ich die Schleife manuell abwickle, funktioniert es:
;; WORKS
(my/create-defun zz-abc)
(my/create-defun zz-def)
(my/create-defun zz-ghi)
Aber das Folgende funktioniert nicht, wenn ich die Symbolnamen übergebe (was wahrscheinlich passiert, wenn sich die Schleife von selbst abwickelt). Beachten Sie die Anführungszeichen vor den Makroargumenten.
;; DOES *NOT* WORK
(my/create-defun 'zz-abc)
(my/create-defun 'zz-def)
(my/create-defun 'zz-ghi)
Aktualisieren
Dank der Hilfe von @wvxvw habe ich es endlich geschafft !
Wie @wvxvw vorschlägt, werde ich keine Batch-generierenden Defuns für jeden Anwendungsfall erstellen. Dies war ein spezieller Anwendungsfall, bei dem XYZ
ich für ein Thema mit dem Namen einen Defun generieren möchte load-theme/XYZ
, der die Aufgabe erfüllt
- Deaktivieren aller anderen Themen, die möglicherweise aktiv sind
- Fordern
load-theme
nachXYZ
- Weitere benutzerdefinierte Aufgaben im Zusammenhang mit diesem Thema ausführen; Ich übergebe die benutzerdefinierten Einstellungen für jedes Thema über die
my/themes
Liste.
cons
es, aber ich plane, diese in Listen mit benutzerdefinierten Eigenschaften für jedes Thema zu konvertieren.
(my/create-defun name)
dreimal aufgerufen , also sollten Sie eine name
dreimal definierte Funktion definieren .
defuns
in einprogn
.progn
darf ein Formular der obersten Ebene sein (in dem Sinne, dass alles, was für Formulare der obersten Ebene gilt, auch für den Inhalt von giltprogn
). Aber ich würde die Gründe für die Erstellung von Funktionen so in Frage stellen: Warum nicht beispielsweise eine Has-Tabelle mit Lambdas als Werten?