On Wed, Oct 04, 2023 at 04:29:11PM -0400, Nick Bowler wrote: > Hi, > > On 2023-10-04, Sébastien Hinderer <Sebastien.Hinderer@xxxxxxxx> 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 .