Макрос Lisp set-or-nconc не может работать - PullRequest
0 голосов
/ 26 ноября 2010

Я пытался создать макрос для переменной привязки, если она не привязана, в противном случае, если она связана, чем добавление к ее значению

(defmacro set-or-nconc (var &rest args)
         `(,(if (and (boundp var) (not (null ,var)))
                'nconc 'setq)
            ,var ,@args))

Требуемый вывод:

(set-or-nconc i '(a b)) => '(a b)
i                       => '(a b)
(set-or-nconc i '(a b)) => '(a b a b)
i                       => '(a b a b)

Но мой определенный макрос не работает, особенно если я привязан к nil. Кто-нибудь имеет представление, в чем проблема с этим макросом?

1 Ответ

3 голосов
/ 26 ноября 2010

Определение использования 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) -производство, обычно быстрее накапливать путем анализа, а затем (при необходимости) делать обратное в конце.

...