mirror of
https://github.com/doomemacs/doomemacs
synced 2025-08-01 12:17:25 -05:00
refactor(lib): backport static-{if,when,unless}
And deprecate our eval-{if,when}! macros.
This commit is contained in:
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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)
|
||||
|
@ -70,7 +70,7 @@
|
||||
;;
|
||||
;;; Implementations
|
||||
|
||||
(eval-if! (modulep! -flyspell)
|
||||
(static-if (modulep! -flyspell)
|
||||
|
||||
(use-package! spell-fu
|
||||
:when (executable-find "aspell")
|
||||
|
Reference in New Issue
Block a user