Я пытаюсь написать следующий код, чтобы написать макрос, который, учитывая имя класса, автоматически создает класс с переменной экземпляра name
и аксессуар для него в форме от classname-name
.Создайте имя класса доступа из строки внутри макроса CL
(defmacro def-named-class (class-name)
`(defclass ,class-name()
((name :accessor ,(intern (format nil "~A-~A" class-name "name"))
:initarg :name
:initform ""))))
Проблема здесь заключается в том, что, когда макрос работает, скажем, с аргументом foo
, имя функции аксессора приходит как |FOO-name|
, но я хотел бы, чтобы это было просто foo-name
. Причина в том, (intern "foo-name")
возвращает символ |foo-name|
. Однако, если я пытаюсь сделать то же самое с нормальной функцией, например:
(defmacro def-hyp (name1 name2 arg-list &body body)
`(defun ,(intern (format nil "~A-~A" name1 name2))
,arg-list
,@body))
А потом называют это как (def-hyp foo name() 'foo-name)
он правильно производит функцию с именем foo-name
. Поэтому мне интересно, есть ли какой-либо метод для получения одного и того же символа из строкового представления внутри первого макроса. Я использую Clozure CL.
Do ответы [объединения двух переменных в одно имя функции in macro] (http://stackoverflow.com/questions/24433035/combining-two-variables-into-one-function-name-in-macro) решить это для вас? Обратите внимание, в частности, часть о формате в принятом ответе (отказ от ответственности: это мой). –