Re: macro that renames a function and records in a global list each non-local exit
Stavros Macrakis <[email protected]> Thu, 4 Jun 2026 11:52:36 -0400
| Newsgroups | gmane.comp.mathematics.maxima.general |
|---|---|
| Message-ID | <CACLVabWcY2RfEN_rb2TVP_kxXxE-yxib=buWKwYbQmiP8yX4ZA@mail.gmail.com> |
Yes, but you can always add it to the Maxima distribution if it's useful.
Presumably the implementors have learned over time what the gotchas are and
fixed them.
-s
On Thu, Jun 4, 2026 at 11:47 AM Barton Willis <[email protected]> wrote:
> Thanks, I didn't know about 'cl-advice'. My understanding is that
> `cl-advice` is *not* included in any ANSI CL implementation. Maybe I'll
> stick to pedestrian ways.
>
> --Barton
> ------------------------------
> *From:* Stavros Macrakis <[email protected]>
> *Sent:* Wednesday, June 3, 2026 1:49 PM
> *To:* Barton Willis <[email protected]>
> *Cc:* <[email protected]> <
> [email protected]>
> *Subject:* Re: [Maxima-discuss] macro that renames a function and records
> in a global list each non-local exit
>
> Caution: Non-NU Email
>
> You might want to look into the *cl-advice* library, or maybe making
> functions into CLOS generic functions and then using the *:before,
> :after, *and *:around* methods.
>
>
> On Wed, Jun 3, 2026 at 8:19 AM Barton Willis via Maxima-discuss <
> [email protected]> wrote:
>
>
>
>
> Here is an AI‑assisted macro (with some push‑back from me along the way)
> that renames a Common Lisp function and records information about each
> non‑local exit in a global list:
>
> ;; AI written
> (defmacro define-renamed-with-nlexit (old-name new-name log-var)
> "Rename OLD-NAME to NEW-NAME and wrap OLD-NAME so that any non-local
> exit is recorded in LOG-VAR, which must be a place suitable for PUSH."
> (let ((args (gensym "ARGS")))
> `(progn
> ;; Save the old definition under NEW-NAME
> (setf (symbol-function ',new-name)
> (symbol-function ',old-name))
>
> ;; Define the wrapper under OLD-NAME
> (setf (symbol-function ',old-name)
> (lambda (&rest ,args)
> (handler-case
> (apply #',new-name ,args)
>
> (condition (c)
> (push (ftake 'mlist :function ',old-name
> :renamed ',new-name
> ;; Maxima list of args: (mlist arg1 arg2
> ...)
> :args (cons (list 'mlist) ,args)
> :condition c
> :timestamp (get-universal-time))
> ,log-var)
> (signal c)))))
>
> ',old-name)))
>
> Running the testsuite with
>
> (defvar *nonlocal-exit-limit* nil)
> (define-renamed-with-nlexit $limit old-limit *nonlocal-exit-limit*)
>
> Results in
>
> (%i5) :lisp(msetq $xxx (fapply 'mlist *nonlocal-exit-limit*))
>
> < stuff deleted>
>
> (%i5) map(sixth,xxx);
>
> (%o5) [[inf/ind],[1/(zerob+zeroa)],[x,x,box(inf)]]
>
> Maybe somebody could refine this macro further.
>
> --Barton
>
> _______________________________________________
> Maxima-discuss mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/maxima-discuss
> <https://urldefense.com/v3/__https://lists.sourceforge.net/lists/listinfo/maxima-discuss__;!!PvXuogZ4sRB2p-tU!BvFvSokXqsMJ6zEYclOHwkLI0GEF4Cu6Yh0hnI_j4OaK-ISaItMDz64sFFHHZzxwtxSuxHPa2KUsP08$>
>
>
_______________________________________________
Maxima-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/maxima-discuss