[Top][All Lists]

[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


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_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.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]