named arguments in m4?
Daniel Goldman <[email protected]> Sun, 20 Apr 2014 15:36:50 -0700
| Newsgroups | gmane.comp.gnu.m4.general |
|---|---|
| Message-ID | <[email protected]> |
Hi, Any chance m4 could (or would want to) support named arguments? In other environments, I usually prefer named arguments over $n arguments. Take the following example with $n arguments: $ cat temp.m4 m4_define(EXCHANGE, $2 : $1)m4_dnl EXCHANGE(`Arg #1', `Arg #2') $ m4 -P temp.m4 Arg #2 : Arg #1 Maybe m4 could allow named arguments, something similar to (not suggesting this currently works): $ cat temp.m4 m4_define(EXCHANGE, $arg_2 : $arg_1, arg_1, arg_2)m4_dnl EXCHANGE(`Arg #1', `Arg #2') $ m4 -P temp.m4 Arg #2 : Arg #1 This would be somewhat analogous to cpp, which allows named arguments, and which has a nice syntax (IMO) in this situation: $ cat temp.h #define EXCHANGE(arg1, arg2) arg2 : arg1 EXCHANGE(Arg #1, Arg #2) $ cpp -P temp.h Arg #2 : Arg #1 For the short examples shown above, it hardly matters. But for longer macro expansions, variable names like $width, $height, $file_name are a LOT better than $1, $2, $3. When I write shell scripts, I always assign $1, etc. to named variables. Same with C and argv[1], etc. I experimented some, and see there is at least one way to do this in m4: $ cat temp.m4 m4_define(MULTI_LINE_MACRO_FOR_CREATING_HTML_BLOCK, `m4_dnl m4_define(`WIDTH', $1)m4_dnl m4_define(`HEIGHT', $2)m4_dnl m4_define(`FILE_NAME', $3)m4_dnl <img align="left" border="1" vspace="0" hspace="10" width="WIDTH" height="HEIGHT" src="/vn/ro/images/FILE_NAME" alt="Photograph above Navigation" title="Photograph above Navigation" >')m4_dnl MULTI_LINE_MACRO_FOR_CREATING_HTML_BLOCK(100, 200, file1.jpg) $ m4 -P temp.m4 <img align="left" border="1" vspace="0" hspace="10" width="100" height="200" src="/vn/ro/images/file1.jpg" alt="Photograph above Navigation" title="Photograph above Navigation" > Is there a better way to use named arguments? Any other suggestions? Thanks, Daniel