refactor(lib): backport static-{if,when,unless}

And deprecate our eval-{if,when}! macros.
This commit is contained in:
Henrik Lissner
2025-04-14 22:58:59 -04:00
parent faea320162
commit a13719af45
4 changed files with 46 additions and 18 deletions

View File

@ -175,5 +175,47 @@ The functions in the hook are called with one parameter -- the
enable-local-variables)))
(funcall fn variables dir-name))))
;; Introduced in 30.1
(unless (fboundp 'static-if)
(defmacro static-if (condition then-form &rest else-forms)
"A conditional compilation macro.
Evaluate CONDITION at macro-expansion time. If it is non-nil,
expand the macro to THEN-FORM. Otherwise expand it to ELSE-FORMS
enclosed in a `progn' form. ELSE-FORMS may be empty."
(declare (indent 2)
(debug (sexp sexp &rest sexp)))
(if (eval condition lexical-binding)
then-form
(cons 'progn else-forms))))
;;; From Emacs 31+
(unless (fboundp 'static-when)
(defmacro static-when (condition &rest body)
"A conditional compilation macro.
Evaluate CONDITION at macro-expansion time. If it is non-nil,
expand the macro to evaluate all BODY forms sequentially and return
the value of the last one, or nil if there are none."
(declare (indent 1) (debug t))
(if body
(if (eval condition lexical-binding)
(cons 'progn body)
nil)
(macroexp-warn-and-return (format-message "`static-when' with empty body")
(list 'progn nil nil) '(empty-body static-when) t)))
(defmacro static-unless (condition &rest body)
"A conditional compilation macro.
Evaluate CONDITION at macro-expansion time. If it is nil,
expand the macro to evaluate all BODY forms sequentially and return
the value of the last one, or nil if there are none."
(declare (indent 1) (debug t))
(if body
(if (eval condition lexical-binding)
nil
(cons 'progn body))
(macroexp-warn-and-return (format-message "`static-unless' with empty body")
(list 'progn nil nil) '(empty-body static-unless) t))))
(provide 'doom-compat)
;;; doom-compat.el ends here

View File

@ -486,22 +486,8 @@ echo-area, but not to *Messages*."
(save-silently t))
(prog1 ,@forms (message ""))))))
(defmacro eval-if! (cond then &rest body)
"Expands to THEN if COND is non-nil, to BODY otherwise.
COND is checked at compile/expansion time, allowing BODY to be omitted entirely
when the elisp is byte-compiled. Use this for forms that contain expensive
macros that could safely be removed at compile time."
(declare (indent 2))
(if (eval cond)
then
(macroexp-progn body)))
(defmacro eval-when! (cond &rest body)
"Expands to BODY if CONDITION is non-nil at compile/expansion time.
See `eval-if!' for details on this macro's purpose."
(declare (indent 1))
(when (eval cond)
(macroexp-progn body)))
(define-obsolete-function-alias 'eval-if! 'static-if "3.0.0")
(define-obsolete-function-alias 'eval-when! 'static-when "3.0.0")
(defmacro versionp! (v1 comp v2 &rest comps)
"Perform compound version checks.

View File

@ -596,7 +596,7 @@ which case it will save it without prompting."
;; Introduced in Emacs 29.
;;;###autoload
(eval-when! (not (fboundp 'find-sibling-file))
(static-unless (fboundp 'find-sibling-file)
(defvar find-sibling-rules nil)
(defun find-sibling-file (file)

View File

@ -70,7 +70,7 @@
;;
;;; Implementations
(eval-if! (modulep! -flyspell)
(static-if (modulep! -flyspell)
(use-package! spell-fu
:when (executable-find "aspell")