Я пытаюсь создать что-то похожее на with-eval-after-load
за исключением того, что тело оценивает после того, как все функции были предоставлены.Кроме того, список функций должен быть предоставлен во время выполнения.
Например, я хочу что-то вроде
(setq feature-list '(a b))
(something feature-list (message "a and b both provided"))
, где это выполняет функциональность, эквивалентную
(with-eval-after-load 'a
(with-eval-after-load 'b
(message "a and b both provided")))
Предоставлениесписок во время выполнения кажется сложной частью.Без этого требования я мог бы написать макрос:
(defmacro eval-after-load-all (features body)
(if (null features)
body
`(with-eval-after-load (quote ,(car features))
(eval-after-load-all ,(cdr features) ,body))))
и передать список с помощью:
(eval-after-load-all (a b) (message "a and b both provided"))
Но если передать его feature-list
, он будет использовать буквенные символы "list ".
Я попытался определить рекурсивную функцию:
(defun eval-after-load-all (features body)
(if (null features)
body
(with-eval-after-load (car features)
(eval-after-load-all (cdr features) body))))
Но когда я вычисляю
(eval-after-load-all feature-list (message "a and b both provided"))
(provide 'a)
;; (provide 'b)
Это вызывает ошибку при вызове (provide 'a)
жаловаться на void-variable body
в шаге рекурсивного вызова (т. е. последнее выражение в функции).Эта сфера смущает меня.Почему body
здесь пусто?
Я также пытался обернуть макрос в функцию, чтобы я мог передать ей вычисленные аргументы:
(defun macro-wrapper (features body)
(eval-after-load-all features body))
, но это вызывает жалобу при определении функции, чтоfeatures
это не список: wrong-type-argument listp features
.