DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH
 

(m4.info.gz) Answers

Info Catalog (m4.info.gz) Compatibility (m4.info.gz) Top (m4.info.gz) Copying This Manual
 
 16 Correct version of some examples
 ***********************************
 
 Some of the examples in this manuals are buggy, for demonstration
 purposes.  Correctly working macros are presented here.
 
    The `exch' macro ( Arguments) as presented requires clients
 to double quote their arguments.  A nicer definition, which lets
 clients follow the rule of thumb of one level of quoting per level of
 parentheses, involves adding quotes in the definition of `exch', as
 follows:
 
      define(`exch', ``$2', `$1'')
      =>
      define(exch(`expansion text', `macro'))
      =>
      macro
      =>expansion text
 
    The `cleardivert' macro ( Cleardiv) cannot, as it stands, be
 called without arguments to clear all pending diversions.  That is
 because using undivert with an empty string for an argument is different
 than using it with no arguments at all.  Compare the earlier definition
 with one that takes the number of arguments into account:
 
      define(`cleardivert',
        `pushdef(`_n', divnum)divert(`-1')undivert($@)divert(_n)popdef(`_n')')
      =>
      divert(`1')one
      divert
      =>
      cleardivert
      =>
      undivert
      =>one
      =>
      define(`cleardivert',
        `pushdef(`_num', divnum)divert(`-1')ifelse(`$#', `0',
          `undivert`'', `undivert($@)')divert(_num)popdef(`_num')')
      =>
      divert(`2')two
      divert
      =>
      cleardivert
      =>
      undivert
      =>
 
    The `fatal_error' macro ( M4exit) does not quite match the
 format of internal error messages when invoked inside wrapped text, due
 to the current limitations of `__file__' ( Location) when
 invoked inside `m4wrap'.  Since `m4' omits the file and line number
 from its warning messages when there is no current file (or
 equivalently, when the current line is 0, since all files start at line
 1), a better implementation would be:
 
      define(`fatal_error',
        `errprint(__program__:ifelse(__line__, `0', `',
          `__file__:__line__:')` fatal error: $*
      ')m4exit(`1')')
      =>
      m4wrap(`divnum(`demo of internal message')
      fatal_error(`inside wrapped text')')
      =>
      ^D
      error-->m4: Warning: excess arguments to builtin `divnum' ignored
      =>0
      error-->m4: fatal error: inside wrapped text
 
Info Catalog (m4.info.gz) Compatibility (m4.info.gz) Top (m4.info.gz) Copying This Manual
automatically generated byinfo2html