После долгого времени изучения CL и практики в качестве хобби в различных небольших проектах у меня все еще есть некоторые пустые области на моей личной карте CL.Недавно у меня было несколько функций, использующих одну и ту же конструкцию let
, и я подумал о написании макроса, который делает код более лаконичным:
(defmacro with-context (&body body)
`(let ((context (make-array 4 :element-type 'fixnum
:initial-contents '(0 1 2 3))))
,@body))
, чтобы позже я мог определять функции какминимальный пример):
(defun test-a ()
(with-context
(setf (aref context 3)
(+ (aref context 0) (aref context 1)))
context))
Теперь мне было интересно, смогу ли я сократить выражения (aref context n)
с помощью макроса / функции, например (context n)
.
(defun context (n)
(aref context n))
Но переменная context
неизвестно во время компиляции, конечно.Я просто не знаю, есть ли у меня случай базового недопонимания или как я могу сказать Лиспу, чего я на самом деле хочу.Итак, мой вопрос в основном, если это возможно, и если это хорошая идея.