LINUX.ORG.RU

[Lisp] туплю с defmacro

 


0

2

Есть код:


(defun get-action-name (list)
	(mapcar #'(lambda (def-list) (list (first def-list) (second def-list))) list))

(defmacro with-new-actions (parent actions-list
							&body body)
  (get-action-name actions-list))

(defparameter *workspace-actions-list* 
  '((aNew "&New" #'new-page-handler "tab- new" "Ctrl+N")
	(aOpen "&Open" #'open-page-handler "open" "Ctrl+O")))

(with-new-actions 'parent *workspace-actions-list*) ;; 1

(with-new-actions 'parent ((aNew "&New" #'new-page-handler "tab- new" "Ctrl+N")
	(aOpen "&Open" #'open-page-handler "open" "Ctrl+O"))) ;; 2

Проблема в том что строка (2) раскрывается, а строка (1) - нет.

Вопрос как раскрыть *workspace-actions-list* внутри defmacro ? Google молчит, вот туплю и мучаюсь.

★★★
Ответ на: комментарий от den73

> А можно ещё так, потому что body ты всё равно не используешь:

body потом появится. А что делать если результат надо в let загнать ? я уже в этих backquote запутался.

(defmacro with-new-actions (parent actions-list
							&body body)
  (let ((AAA (get-action-name actions-list)))
	`,AAA))

Как сдесь заставить *workspace-actions-list* раскрыться ?

Darkman ★★★
() автор топика
Ответ на: комментарий от Darkman

Лучше всего будет, если ты напишешь, что ты хочешь получить на выходе. Потому что пока что я не совсем понял, что ты хочешь.

den73 ★★★★★
()
Ответ на: комментарий от Darkman

Квазицитирование работает примерно так же, как конкатенация строк. `(a ,b c) в лиспе - примерно то же самое, что "(a,«+b+»,c)" в «обычном» языке, где генерация кода производится сложением строк.

den73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.