В работата си се опитвам да използвам макроси в 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-flag използвам concatenate string и read-from-string, но мисля, че моят метод не е каноничен. Има ли по-подходящи подходи за решаване на подобен проблем?
P.S. Това решение не работи за мен Можете ли да създавате интерактивни функции в макрос на Emacs Lisp?
(setf attrlist (push attrbuf attrlist))
е просто(push attrbuf attrlist)
. - person Rainer Joswig   schedule 20.09.2014