Ich versuche den folgenden Code, um einen Makro zu schreiben, der eine Klasse mit einer name
Instanzvariable und einem Accessor für das Formular automatisch erstellt von classname-name
.Erstellen Sie einen Klassenaccessornamen aus einem String in einem CL-Makro
(defmacro def-named-class (class-name)
`(defclass ,class-name()
((name :accessor ,(intern (format nil "~A-~A" class-name "name"))
:initarg :name
:initform ""))))
Das Problem hier ist, dass, wenn das Makro ausgeführt wird, etwa mit einem Argument foo
, der Name der Accessorfunktion als |FOO-name|
kommt, aber ich würde es nur foo-name
sein wollen. Der Grund ist, (intern "foo-name")
gibt ein Symbol |foo-name|
zurück. Allerdings, wenn ich versuchen, das gleiche mit einer normalen Funktion zu tun, wie folgt aus:
(defmacro def-hyp (name1 name2 arg-list &body body)
`(defun ,(intern (format nil "~A-~A" name1 name2))
,arg-list
,@body))
Und es dann nennen wie (def-hyp foo name() 'foo-name)
es produziert richtig eine Funktion mit dem Namen foo-name
. Ich frage mich also, ob es eine Methode gibt, um genau das gleiche Symbol aus der Zeichenfolgendarstellung im ersten Makro zu erhalten. Ich benutze Clozure CL.
Sie die Antworten auf [die Kombination von zwei Variablen in einem Funktionsnamen im Makro] (http://stackoverflow.com/questions/24433035/combining-two-variables-into-one-function-name-in-macro) lösen dies für Sie? Beachten Sie besonders den Teil über das Format in der akzeptierten Antwort (Disclaimer: es gehört mir). –