Macros for doing arithmetic

기본적으로 매크로에 () 가 없으면 매크로로 인식되지 않습니다.

incr, decr

$ m4 <<\@                 $ m4 <<\@
incr(4)                   decr(7)
@                         @

5                         6

eval

eval ( expression )
eval ( expression, radix )

M4 는 기본적으로 숫자도 스트링으로 취급하지만 eval 매크로에서는 숫자로 취급되어 연산됩니다. 전달된 인수는 동일하게 prescan 에의해 매크로가 확장되는데 확장 결과는 숫자가 돼야 하고 quotes 이 존재하면 안 됩니다.

$ m4 <<\@                            $ m4 <<\@
define(`foo', 5)                     eval( index(`Hello world', `llo') >= 0)
define(`bar', `foo')                 eval( index(`Hello world', `llo') == -1)
eval(bar + 100)                      @
@                                    
                                     1       # 참은  1
105                                  0       # 거짓은 0
$ m4 <<\@                            $ m4 <<\@
eval(10)                             eval(1000)
eval(010)      # 8 진수               eval(1000, 8)      # 1000 을 8 진수로 출력
eval(0x10)     # 16 진수              eval(1000, 16)     # 1000 을 16 진수로 출력
@                                    @

10                                   1000
8                                    1750     # 8 진수
16                                   3e8      # 16 진수
---------------------------

$ m4 <<\@
define(`square', `eval(`($1) ** 2')')
square(9)
@

81

연산자 우선순위가 높은 것부터 낮은 순서입니다.

Operators Description
+ - unary plus and minus
** exponent
* / % multiplication, division, modulo ( eval( 8 / -5 ) == -1 )
+ - addition and subtraction
<< >> shift up or down ( eval( -8 >> 1 ) == -4 )
== != < <= >= > relational
! logical NOT ( converts non-zero to 0, 0 to 1 )
~ bitwise NOT ( eval( ~0 ) == -1 )
& bitwise AND ( eval( 6 & 5 ) == 4 )
^ bitwise Exclusive OR ( eval( 3 ^ 2 ) == 1 )
| bitwise OR ( eval( 1 | 2 ) == 3 )
&& logical AND
|| logical OR