[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Evaluating arithmetic expressions with macros (eval)
From: |
Andreas Kähäri |
Subject: |
Re: Evaluating arithmetic expressions with macros (eval) |
Date: |
Wed, 4 Oct 2023 23:02:42 +0200 |
On Wed, Oct 04, 2023 at 04:29:11PM -0400, Nick Bowler wrote:
> Hi,
>
> On 2023-10-04, Sébastien Hinderer <Sebastien.Hinderer@inria.fr> wrote:
> > I find myself stuck with something which I assume is trivial. I define:
> >
> > m4_define([X], [9])
> > m4_define([Y], [3])
> >
> > And I would like to define Z as being the arithmetic sum of X and Y and
> > can seem to get it.
> >
> > I tried several variations of eval but had no success. I understand
> > that all the macros need to be expanded before eval is called but I
> > don't understand how to do it.
>
> The short answer for your specific example is to simply not quote the
> arguments:
>
> m4_define([Z], m4_eval(X + Y))
Not being an m4 wizard, I can only ask whether it would be better to put
parentheses around the X and Y arguments, i.e.
m4_define([Z], m4_eval((X) + (Y)))
... to guard against the possibility of X and Y being defined as more
complex expressions? It might not be necessary in the case of addition,
but it might be in other cases.
I'm just drawing from what I know about similar macros in other
languages.
Regrads,
Andreas
>
> This approach is probably sufficient for most typical uses of m4_eval,
> as there would seem to be little chance of unwanted macro expansion.
>
> Some details, when m4 sees the following macro expansion:
>
> m4_define([Z], m4_eval(X + Y))
>
> - The first argument contains no unquoted text, so no macro expansion is
> performed. The quotes are removed, and the first argument is "Z".
>
> - The second argument contains unquoted text and a macro:
>
> m4_eval(X + Y).
>
> - The first argument of this contains unquoted text with two macros,
> X and Y. These are replaced with 9 and 3, respectively. There
> are no further macros to expand and no quotes to remove, so the
> actual argument to m4_eval is 9 + 3.
>
> Now m4_eval(9 + 3) is expanded, giving 12. There are no further
> macros to expand and no quotes to remove, so the second argument
> to m4_define is 12.
>
> Now m4_define(Z, 12) is expanded.
>
> Hope that helps,
> Nick
--
Andreas (Kusalananda) Kähäri
Uppsala, Sweden
.