[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
정수연산을 위한 기능은 m4
에 포함이 되어 있으며 이것은 C 의 문법과
비슷 하다. 편리하고 간단한 내장 매크로로 증가와 감소 연산도 쉽게 할 수
있다.
11.1 증가, 감소 연산자 | ||
11.2 정수 표현식의 값을 구하기 |
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
정수의 증가와 감소 계산은 내장 매크로인 incr
과 decr
을
사용하면 된다.
incr(number) decr(number) |
이것은 number의 값이 각각 하나씩 증가하거나 감소한 숫자로 확장된다.
incr(4) ⇒5 decr(7) ⇒6 |
incr
, decr 내장 매크로는 인자가 있을 때에만 인식된다.
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
정수 표현식의 값은 eval
로 구할 수 있다.
eval(expression, opt radix, opt width) |
이것은 expression의 값으로 확장된다.
표현식은 다음의 연산자를 포함할 수 있다. 아래는 연산자의 우선순위가 높은 것부터 나열하였다.
-
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
누승계산을 제외하고는 모든 연산자는 왼쪽부터 조합된다.
많은 m4
의 도구들이 ‘^’ 를 누승계산을 하는 연산자와 혼용을
하며 다른 것들은 ‘^’ 를 비트 배타 논리합 연산을 하는 데 사용된다.
GNU ‘m4’ 는 누승계산시 ‘^’를 사용하였으니 이제는 비트배타
논리합 연산을 하는 데 사용한다.
10진수에는 정해진 접두어가 없다. ‘0’은 8진수임을 나타내고 ‘0x’는 16진수임 을 나타내며, ‘0b’는 2진수임을 나타낸다. ‘0r’는 1에서 36사이의 어떤 기수(radix) 를 표현하는 데 사용한다. 접두어 다음에 바로 기수의 10진표현이나 콜론, 10진수 를 만드는 숫자가 와야 한다. 어떠한 기수든지, 10진수는 ‘0’, ‘1’, ‘2’, …에서 ‘9’ 까지이고 ‘9’를 넘어서서는 ‘a’, ‘b’, …에서 ‘z’까지 이다. 소문자와 대문자 는 서로 혼용하여 사용할 수 있다.
괄호는 보조 표현식을 묶는 데 필요하며 관계적인 연산자는 참이면
1
을, 거짓 이면 ‘0’을 리턴한다.
여기에 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 |
마지막 예의 두 번째에서와 같이, eval
은 매크로 이름은 취급하지
않는다. 매 크로 이름이 합당한 표현으로 확장되거나 합당한 표현의
일부분이라 할지라도 그 렇다. 그러므로 모든 매크로는 eval
에게
넘어가기 전에 확장되어야 한다.
radix가 명시된다면 그것은 확장에서 사용할 수 있도록 해당 진법으로
바뀐 숫자를 서술한다. 기본적으로 진법은 10진수이다. eval
의
결과는 항상 부호가 있다. width 인자는 출력될 때의 최소한의 넒이를
명시한다. 결과는 요구된 넓이를 0으로 채운다.
eval(666, 10) ⇒666 eval(666, 11) ⇒556 eval(666, 6) ⇒3030 eval(666, 6, 10) ⇒0000003030 eval(-666, 6, 10) ⇒-000003030 |
radix는 36진법보다 클수는 없다는 것을 기억하라.
내장 매크로 eval
은 인자가 있어야만 인식을 한다.
[ << ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
This document was generated by Autobuild on September 28, 2013 using texi2html 1.82.