Я использую общий lisp со слизью в emacs и пытаюсь определить простой макрос. Однако, когда я запускаю макрос, буфер слизи emacs становится невосприимчивым, и мой компьютер быстро становится непригодным. Даже после выхода из emacs я получаю сообщения об ошибках в сообщении bash о невозможности выделения памяти.LISP macro fail, crashes slime
Я хочу использовать макрос, чтобы писать такие функции, как эти два
(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))))
Я надеюсь, что это простая ошибка новобранец!
Красивая, это именно то, что мне нужно. Что делает период до создания карты? Я замечаю, что цитаты внутри цитат здесь, хотя другой плакат, казалось, подразумевал, что это была моя оригинальная проблема. – jimpudar
1. ', .' является неприемлемой версией', @ '(unquote-splicing). Он используется для списков, которые недавно созданы (например, «mapcar», в этом случае), которые, как вы знаете, могут быть изменены на месте. Если есть сомнения, просто используйте ', @', что всегда безопасно. 2. Нет, вы все еще не можете использовать цитату здесь, и, в частности, вы не можете просто процитировать «триаду» или «квадрат» или списки шагов. –