[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11. 산술 연산을 위한 매크로

정수연산을 위한 기능은 m4에 포함이 되어 있으며 이것은 C 의 문법과 비슷 하다. 편리하고 간단한 내장 매크로로 증가와 감소 연산도 쉽게 할 수 있다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.1 증가, 감소 연산자

정수의 증가와 감소 계산은 내장 매크로인 incrdecr을 사용하면 된다.

 
incr(number)
decr(number)

이것은 number의 값이 각각 하나씩 증가하거나 감소한 숫자로 확장된다.

 
incr(4)
⇒5
decr(7)
⇒6

incr, decr 내장 매크로는 인자가 있을 때에만 인식된다.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11.2 정수 표현식의 값을 구하기

정수 표현식의 값은 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 February 7, 2019 using texi2html 1.82.