Stefan Monnier [2022-09-06 12:01 -0400] wrote: >>> Admittedly, another way around these kinds of problems is to teach the >>> compiler how to deal with an unknown macro. I.e. something like >>> (declare-macro my-foo ...) so that if the compiler see (my-foo ...) but >>> `my-foo` can't be macroexpanded (because the macro is not yet defined), >>> it doesn't incorrectly compile it into a function call, but instead >>> residualizes it into something like a call to `eval`. Making it >>> interact correctly with lexical scoping could be tricky (I guess the >>> simplest solution would be to residualize the whole toplevel expression >>> in which the macro call was found). > > A low-tech way to do it is to let the programmer do it by hand, e.g.: > > (defmacro smalltalk--when-fboundp (sym exp) > (declare (indent 1) (debug (symbolp form))) > (if (fboundp sym) > exp > ;; `sym' is not defined during compilation, but keep the test at > run-time, > ;; in case we use the compiled file on a newer Emacs. > `(eval '(if (fboundp ',sym) ,exp)))) > > It can still break if you use in `exp` lexically scoped vars declared in > the context, but that's considered a "programmer's problem" :-( > >> Another downside of macros not directly addressed by this approach is >> that packages using them may have the outrageous desire to both support >> older Emacsen and build cleanly, at the same time! Recall, for example, >> this unresolved shortdoc thread: >> https://lists.gnu.org/r/emacs-devel/2021-09/msg01719.html > > Would this kind of `<foo>--when-fboundp` help there? Yes, thanks, it allows the macro to be used within with-eval-after-load across all Emacs versions. Sadly eval-after-load is still needed to account for Emacs 28 not autoloading the shortdoc entrypoint macro, but that's down to the package's API/hooks, not the use of macros. -- Basil[Prev in Thread] Current Thread [Next in Thread]
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4