[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Suggestion to add ifndef builtin macro
From: |
Daniel Goldman |
Subject: |
Suggestion to add ifndef builtin macro |
Date: |
Thu, 15 May 2014 13:13:43 -0700 |
User-agent: |
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Thunderbird/24.3.0 |
Hi,
I would like to suggest the small change to add an m4_ifndef builtin
macro to some future version of m4.
In case any question, m4_ifndef would be exactly the same as m4_ifdef,
with the logic reversed. Modifying the manual text:
***************
Builtin: ifndef (name, string-1, [string-2]
If name is NOT defined as a macro, ifndef expands to string-1, otherwise
to string-2. If string-2 is omitted, it is taken to be the empty string
(according to the normal rules).
The macro ifndef is recognized only with parameters.
**********
Reason #1 I suggest adding m4_ifndef is for better communication, to
make the language easier to express the logic. Perhaps a lot of m4 usage
is obscure, but I don't consider that a virtue. I would argue that:
m4_ifndef(`MACRO_1', `MACRO_1' NOT defined)
is clearer than:
m4_ifdef(`MACRO_1', , `MACRO_1' NOT defined)
because it is more clear that we are testing for "not defined", and
having the separate macro makes it easier to scan the code for
particular logical patterns.
*********
Reason #2 I suggest adding is because since it's so closely related to
m4_ifdef, my guess is that it would not be that hard to code m4_ifndef.
**********
Reason #3 I suggest adding is because as a sample of one, if m4_ifndef
was available, I would use it. :) So at least one m4 user would find it
beneficial.
********
Reason #1 in favor of NOT adding is because m4_ifdef is adequate to do
the logical operations. To my understanding the following two macros are
100% equivalent:
m4_ifdef(`MACRO_1', `MACRO_1' defined, `MACRO_1' NOT defined)
m4_ifndef(`MACRO_1', `MACRO_1' NOT defined, `MACRO_1' defined)
But the single argument form seems more clear with m4_ifndef. I like
having both symmetric forms:
m4_ifdef(`MACRO_1', `MACRO_1' defined)
m4_ifndef(`MACRO_1', `MACRO_1' NOT defined)
***********
Reason #2 in favor of NOT adding is there is probably some way to do
this reliably with a composite macro. Scanning through some past posts,
I see references to ifndef, so maybe this is already done. Here is my
best attempt, which seems to work correctly, please correct my logic if
some flaw:
$ cat ifndef-02.m4
m4_define(`m4_ifndef', `m4_ifdef(`$1', `$3', `$2')')
m4_define(`MACRO_1')
m4_ifdef(`MACRO_1', ``MACRO_1' defined')
m4_ifdef(`MACRO_1', ``MACRO_1' defined', ``MACRO_1' NOT defined')
m4_ifdef(`MACRO_2', ``MACRO_2' defined')
m4_ifdef(`MACRO_2', ``MACRO_2' defined', ``MACRO_2' NOT defined')
m4_ifndef(`MACRO_1', ``MACRO_1' NOT defined')
m4_ifndef(`MACRO_1', ``MACRO_1' NOT defined', ``MACRO_1' defined')
m4_ifndef(`MACRO_2', ``MACRO_2' NOT defined')
m4_ifndef(`MACRO_2', ``MACRO_2' NOT defined', ``MACRO_2' defined')
$ m4 -P ifndef-02.m4
MACRO_1 defined
MACRO_1 defined
MACRO_2 NOT defined
MACRO_1 defined
MACRO_2 NOT defined
MACRO_2 NOT defined
But even if a composite m4_ifndef macro words, it seems logical and
useful to include as a builtin, as a standard part of the language.
Thanks,
Daniel
- Suggestion to add ifndef builtin macro,
Daniel Goldman <=