m4-discuss
[Top][All Lists]
Advanced

[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



reply via email to

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