DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(m4.info) Eval

Info Catalog (m4.info) Incr (m4.info) Arithmetic
 
 Evaluating integer expressions
 ==============================
 
    Integer expressions are evaluated with `eval':
 
      eval(EXPRESSION, opt RADIX, opt WIDTH)
 
 which expands to the value of EXPRESSION.
 
    Expressions can contain the following operators, listed in order of
 decreasing precedence.
 
 `-'
      Unary minus
 
 `**'
      Exponentiation
 
 `*  /  %'
      Multiplication, division and modulo
 
 `+  -'
      Addition and subtraction
 
 `<<  >>'
      Shift left or right
 
 `==  !=  >  >=  <  <='
      Relational operators
 
 `!'
      Logical negation
 
 `~'
      Bitwise negation
 
 `&'
      Bitwise and
 
 `^'
      Bitwise exclusive-or
 
 `|'
      Bitwise or
 
 `&&'
      Logical and
 
 `||'
      Logical or
 
    All operators, except exponentiation, are left associative.
 
    Note that many `m4' implementations use `^' as an alternate operator
 for the exponentiation, while many others use `^' for the bitwise
 exclusive-or.  GNU `m4' changed its behavior: it used to exponentiate
 for `^', it now computes the bitwise exclusive-or.
 
    Numbers without special prefix are given decimal.  A simple `0'
 prefix introduces an octal number.  `0x' introduces an hexadecimal
 number.  `0b' introduces a binary number.  `0r' introduces a number
 expressed in any radix between 1 and 36: the prefix should be
 immediately followed by the decimal expression of the radix, a colon,
 then the digits making the number.  For any radix, the digits are `0',
 `1', `2', ....  Beyond `9', the digits are `a', `b' ... up to `z'.
 Lower and upper case letters can be used interchangeably in numbers
 prefixes and as number digits.
 
    Parentheses may be used to group subexpressions whenever needed.
 For the relational operators, a true relation returns `1', and a false
 relation return `0'.
 
    Here are a few examples of use of `eval'.
 
      eval(-3 * 5)
      =>-15
      eval(index(`Hello world', `llo') >= 0)
      =>1
      define(`square', `eval(($1)**2)')
      =>
      square(9)
      =>81
      square(square(5)+1)
      =>676
      define(`foo', `666')
      =>
      eval(`foo'/6)
      error-->51.eval:14: m4: Bad expression in eval: foo/6
      =>
      eval(foo/6)
      =>111
 
    As the second to last example shows, `eval' does not handle macro
 names, even if they expand to a valid expression (or part of a valid
 expression).  Therefore all macros must be expanded before they are
 passed to `eval'.
 
    If RADIX is specified, it specifies the radix to be used in the
 expansion.  The default radix is 10.  The result of `eval' is always
 taken to be signed.  The WIDTH argument specifies a minimum output
 width.  The result is zero-padded to extend the expansion to the
 requested width.
 
      eval(666, 10)
      =>666
      eval(666, 11)
      =>556
      eval(666, 6)
      =>3030
      eval(666, 6, 10)
      =>0000003030
      eval(-666, 6, 10)
      =>-000003030
 
    Take note that RADIX cannot be larger than 36.
 
    The builtin macro `eval' is recognized only when given arguments.
 
Info Catalog (m4.info) Incr (m4.info) Arithmetic
automatically generated byinfo2html