Я понял, что определенная часть моего кода состоит из групп методов, которые выглядят одинаково (например, у меня есть несколько трио: вспомогательная функция, которая вызывается двумя другими функциями, предназначенными для программиста). Я пытаюсь написать макрос, который определит для меня эти три функции, так что все, что мне нужно сделать, это вызвать макрос. Но моя попытка приводит к отключениям и вызовам функций, которые содержат строки в кавычках вместо сгенерированных имен в качестве новых символов. Что я делаю не так?
Пример (неверный код)
(defmacro def-trio (base-name)
(let
((helper-name (format nil "helper-~a" base-name))
(method-1 (format nil "~a-1" base-name))
(method-2 (format nil "~a-2" base-name)))
`(progn
(defun ,helper-name () 'helper-called)
(defun ,method-1 () (,helper-name) '1-called)
(defun ,method-2 () (,helper-name) '2-called))))
Теперь происходит следующее:
(def-trio my-trio)
==>
(PROGN (DEFUN "helper-MY-TRIO" () 'HELPER-CALLED)
(DEFUN "MY-TRIO-1" () ("helper-MY-TRIO") '1-CALLED)
(DEFUN "MY-TRIO-2" () ("helper-MY-TRIO") '2-CALLED))
Кроме того, после того, как я узнаю, как заставить это работать, есть ли какие-нибудь дополнительные ошибки, если бы у меня были этот макрос определяет другие макросы вместо других функций? Я прочитал Как мне написать макрос, определяющий макрос, в общем lisp , но я думаю, что мой вопрос немного отличается, потому что я ' m спрашивать о программно сгенерированных символах / именах. Я открыт для исправления :) Спасибо!