В своей работе я пытаюсь использовать макросы в Common Lisp и у меня есть несколько вопросов. у меня две функции
(defun when-tagflag ()
(when (= tagflag 1)
(setf tagflag 0)
(push tagbuf taglist)
(setf tagbuf "")))
(defun when-attrflag ()
(when (= attrflag 1)
(setf attrflag 0)
(push attrbuf attrlist)
(setf attrbuf "")))
Очень похожие функции. После нескольких часов экспериментов у меня получился вот такой макрос
defmacro when-flag (name)
(let ((flag (read-from-string (concatenate 'string (string name) "flag")))
(lst (read-from-string (concatenate 'string (string name) "list")))
(buf (read-from-string (concatenate 'string (string name) "buf"))))
`(when (= ,flag 1)
(setf ,flag 0)
(push ,buf ,lst)
(setf ,buf ""))))
> (pprint (macroexpand-1 '(when-flag "tag")))
> (WHEN (= TAGFLAG 1) (SETF TAGFLAG 0) (PUSH TAGBUF TAGLIST) (SETF TAGBUF ""))
Внутри флага when я использую конкатенацию строки и чтение из строки, но я думаю, что мой метод не канонический. Есть ли более подходящие подходы к решению такой проблемы?
P.S. Это решение не работает для меня Можете ли вы создать интерактивный функции в макросе Emacs Lisp?
(setf attrlist (push attrbuf attrlist))
это всего лишь(push attrbuf attrlist)
. - person Rainer Joswig   schedule 20.09.2014