tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Improvement for bmake: boolean values



On Wed, Mar 25, 2009 at 10:21:34AM -0400, der Mouse wrote:
 > > To solve these problems I propose to implement new function for
 > > bmake, say "yesno", treating 1 and [Yy][Ee][Ss] as logical true, and
 > > 0 and [Nn][Oo] as logical false.
 > 
 > In case anyone feels like paying attention to my reactions: I don't
 > like this design; it feels too special-cased.

Me either, and I really don't like the name. At a minimum it should be
named such that it's clear how the truth values are interpreted; maybe
something like "istrue".

 > I'd much prefer adding
 > some kind of function definition syntax so that bsd.$WHATEVER.mk can
 > define yesno() itself.  As a strawman,
 > 
 > .function yesno(s) ((s ==i "yes") || (s == "1") || \
 >      ((s !=i "no") && (s != "0") && error("invalid yesno() argument"))
 > 
 > (I don't know whether ==i / !=i exist at present, though I think those
 > spellings of them don't; I mean case-insensitive == / !=.)

The right way to do this (or at least, the way consistent with the
material already in make) is to add support for $1..$n and an argument
list syntax for variable expansions.

That is, something like ${VAR:> arg1, arg2, arg3} binds $1=arg1,
$2=arg2, $3=arg3 and then expands VAR.

Then you'd get something like this:

ISTRUE=($1 ==i "yes") || ($1 == "1") || \
       (($1 !=i "no") && ($1 != "0") && ${.ERROR:> "Invalid truth value"})

.if ${ISTRUE:> ${FOO}}
...
.endif

.ERROR would need to be a builtin.

The precise choice of punctuation would need some thought so it's both
acceptable-looking and consistent with things that already exist.

I've floated this idea before a couple of times but it's always seemed
like a jumbo-sized can of worms. On the plus side, it's not that big a
jump to implement.

To accompany this it might be helpful to have multiline variable
assignments so variable expansions can contain loops and conditionals,
something like this:

.begin ISTRUE
.if $1 == "yes" || $1 == "YES" || $1 == "1"
.return 1
.elif $1 == "no" || $1 == "NO" || $1 == "0"
.return 0
.else
.error "Invalid truth value: $1"
.end

This is not so trivial to do without reworking the internals of make;
but that rework should probably be done regardless.

(Then there's the question of whether adding functions means it's
really time to also add some typechecking... etc. etc.)

-- 
David A. Holland
dholland%netbsd.org@localhost


Home | Main Index | Thread Index | Old Index