Определение использования setq
или nconc
выполняется во время расширения макроса, а не во время выполнения. Это немного проблемы. Есть также некоторые проблемы с вашим выражением в обратном кавычке, так как есть либо «,» слишком много (в (null ,var)
) или слишком мало (в (boundp var)
, при необходимости в другом обратном кавычке).
Ниже по крайней мере кое-что приближается к рабочему решению, откладывая выбор использования setq
или nconc
до времени выполнения:
(defmacro set-or-nconc (var &rest args)
`(if (and (boundp ',var) (not (null ,var)))
(nconc ,var ,@args)
(setq ,var ,@args)))
Также имейте в виду, что использование этого для постепенного построения списка будет иметь более или менее О (n ^ 2) -производство, обычно быстрее накапливать путем анализа, а затем (при необходимости) делать обратное в конце.