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 |