Я использую обычный lisp со слизью в emacs и пытаюсь определить простой макрос. Однако, когда я запускаю макрос, буфер слизи emacs перестает отвечать, и мой компьютер быстро становится непригодным для использования. Даже после выхода из emacs я получаю сообщения об ошибках в приглашении bash о невозможности выделить память.
Я хочу использовать свой макрос для написания таких функций, как эти два
(defun triad (foo scale)
"Generates a triad on scale-step FOO of scale SCALE"
(list (%part (- foo 1) scale)
(%part (+ foo 1) scale)
(%part (+ foo 3) scale)))
(defun quad (foo scale)
"Generates a quad on scale step FOO of scale SCALE"
(list (%part (- foo 1) scale)
(%part (+ foo 1) scale)
(%part (+ foo 3) scale)
(%part (+ foo 5) scale)))
используя синтаксис вроде
(defchord 'mtriad '(1 3 5))
(defchord 'mquad '(1 3 5 7))
Я решил использовать mapcar и лямбда-функцию для создания желаемого результата. В интерпретаторе это работает для генерации того, что я хочу:
CL-USER> (mapcar (lambda (x) `(%part (+ ,x 2) scale)) '(1 3 5))
((%PART (+ 1 2) SCALE) (%PART (+ 3 2) SCALE) (%PART (+ 5 2) SCALE))
Однако, когда я пытаюсь поместить его в макрос, чтобы сгенерировать вызов defun, он вылетает из слизи и убивает мою память, как только я его вызываю:
(defmacro defchord (name steps)
`(defun ,name (foo scale)
(quote ,(mapcar (lambda (x) `(%part (+ ,x 2) scale)) steps))))
Я надеюсь, что это простая ошибка новичка!