This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GNU M4 source repository".
http://git.sv.gnu.org/gitweb/?p=m4.git;a=commitdiff;h=26b3c17ceb4f4155ff5dd13bcd9cc63039b3f242 The branch, branch-1.6 has been updated via 26b3c17ceb4f4155ff5dd13bcd9cc63039b3f242 (commit) from f87a1e3fe98dd9bf9c746f24a0e8d18958c693e3 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 26b3c17ceb4f4155ff5dd13bcd9cc63039b3f242 Author: Eric Blake <[EMAIL PROTECTED]> Date: Sat May 3 11:51:55 2008 -0600 Document define_blind. * doc/m4.texinfo (Ifelse): Add a new composite macro. * THANKS: Update. Suggested by Mike R. Signed-off-by: Eric Blake <[EMAIL PROTECTED]> ----------------------------------------------------------------------- Summary of changes: ChangeLog | 7 ++++++ THANKS | 1 + doc/m4.texinfo | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 0 deletions(-) diff --git a/ChangeLog b/ChangeLog index 1454e02..6362809 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2008-05-03 Eric Blake <[EMAIL PROTECTED]> + + Document define_blind. + * doc/m4.texinfo (Ifelse): Add a new composite macro. + * THANKS: Update. + Suggested by Mike R. + 2008-04-24 Eric Blake <[EMAIL PROTECTED]> Fix debugmode regression from 2008-04-14. diff --git a/THANKS b/THANKS index eb2a79d..19c1d92 100644 --- a/THANKS +++ b/THANKS @@ -74,6 +74,7 @@ Michael Fetterman [EMAIL PROTECTED] Michael L. Welcome [EMAIL PROTECTED] Mike Frysinger [EMAIL PROTECTED] Mike Lijewski [EMAIL PROTECTED] +Mike R. [EMAIL PROTECTED] Mikhail Teterin [EMAIL PROTECTED] Nelson H. F. Beebe [EMAIL PROTECTED] Nick S. Kanakakorn [EMAIL PROTECTED] diff --git a/doc/m4.texinfo b/doc/m4.texinfo index 0da6b00..4781567 100644 --- a/doc/m4.texinfo +++ b/doc/m4.texinfo @@ -2761,6 +2761,63 @@ foo(`a', `b', `c') @result{}arguments:3 @end example +Since m4 is a macro language, it is even possible to write a macro that +makes defining blind macros easier: + [EMAIL PROTECTED] Composite define_blind (@var{name}, @ovar{value}) +Defines @var{name} as a blind macro, such that @var{name} will expand to [EMAIL PROTECTED] only when given explicit arguments. @var{value} should not +be the result of @code{defn} (@pxref{Defn}). This macro is only +recognized with parameters, and results in an empty string. [EMAIL PROTECTED] deffn + +Defining a macro to define another macro can be a bit tricky. We want +to use a literal @samp{$#} in the argument to the nested @code{define}. +However, if @samp{$} and @samp{#} are adjacent in the definition of [EMAIL PROTECTED], then it would be expanded as the number of +arguments to @code{define_blind} rather than the intended number of +arguments to @var{name}. The solution is to pass the difficult +characters through extra arguments to a helper macro [EMAIL PROTECTED] + +As for the limitation against using @code{defn}, there are two reasons. +If a macro was previously defined with @code{define_blind}, then it can +safely be renamed to a new blind macro using plain @code{define}; using [EMAIL PROTECTED] to rename it just adds another layer of [EMAIL PROTECTED], occupying memory and slowing down execution. And if a +macro is a builtin, then it would result in an attempt to define a macro +consisting of both text and a builtin token; this is not supported, and +the builtin token is flattened to an empty string. + +With that explanation, here's the definition, and some sample usage. +Notice that @code{define_blind} is itself a blind macro. + [EMAIL PROTECTED] +$ @kbd{m4 -d} +define(`define_blind', `ifelse(`$#', `0', ``$0'', +`_$0(`$1', `$2', `$'`#', `$'`0')')') [EMAIL PROTECTED] +define(`_define_blind', `define(`$1', +`ifelse(`$3', `0', ``$4'', `$2')')') [EMAIL PROTECTED] +define_blind [EMAIL PROTECTED] +define_blind(`foo', `arguments were $*') [EMAIL PROTECTED] +foo [EMAIL PROTECTED] +foo(`bar') [EMAIL PROTECTED] were bar +define(`blah', defn(`foo')) [EMAIL PROTECTED] +blah [EMAIL PROTECTED] +blah(`a', `b') [EMAIL PROTECTED] were a,b +defn(`blah') [EMAIL PROTECTED](`$#', `0', ``$0'', `arguments were $*') [EMAIL PROTECTED] example + @cindex multibranches @cindex switch statement @cindex case statement hooks/post-receive -- GNU M4 source repository
