이 세상 에 GNU m4 튜 토리 얼 하나 더 만 들 기 (3)

6719 단어 gnu-m4
전편 에서 보다.http://segmentfault.com/a/1190000004108113
주석 부호# 기 호 는 줄 주석 부호 이다.단, 우리 가 익숙 한 주석 텍스트 와 달리 m4 의 주석 텍스트 는 출력 흐름 으로 전 송 됩 니 다.예 를 들 면:
define(`VERSION',`A1')
VERSION # VERSION `quote' unmatched`

다음으로 전 개 됩 니 다:
A1 # VERSION `quote' unmatched`
changecom 매크로 로 m4 기본 주석 자 를 수정 할 수 있 습 니 다. 예 를 들 어
changecom(`@@')

이렇게 해서 @@ 주석 부호 가 되 었 다.
주석 이 필요 하 다 면 다음 과 같이 할 수 있 습 니 다.
changecom(/*,*/)
changecom 에 어떠한 인자 도 제공 하지 않 으 면 다른 m4 구현 은 기본 주석 부 호 를 복원 하지만 GNU m4 는 기본 주석 부 호 를 복원 하지 않 고 m4 주석 기능 을 닫 습 니 다.기본 설명 자 를 복원 하려 면 다음 과 같이 해 야 합 니 다:
changecom(`#')

m4 주석 텍스트 를 표시 하지 않 으 려 면 dnl 매크로 로 주석 부 호 를 바 꿀 수 있 습 니 다. 예 를 들 어:
define(`VERSION',`A1')
VERSION dnl VERSION `quote' unmatched`
dnl 그 후의 내용 을 줄 끝의 줄 바 꿈 부적 과 함께 모두 제거 할 것 이다.
블록 주석 텍스트 가 표시 되 지 않 으 려 면 조건 부 문 구 를 기반 으로 hack 를 해 야 합 니 다.그러나 주석 이라는 것 은 존재 할 필요 가 없 기 때문에 더 이상 거들 떠 보지 않 는 다.주석 이 중요 하지 않 은 이 유 는 우리 가 더욱 강력 한 주석 체제 인 문형 프로 그래 밍 을 가지 고 있 기 때 문 입 니 다!
따옴표, 탈출 및 비 ASCII 문자
m4 부족 한 점 이 있 습 니 다. 전용 탈출 부적 이 없습니다.따옴표 가 아 닌 문자 에 대해 서 는 따옴표 가 항상 탈출 문자 로 사용 된다.그런데 따옴표 자 체 를 어떻게 탈출 할 수 있 을 까?왼쪽 따옴표 문자 가 일반 문자 로 나타 나 는 경우 가 많 기 때문이다.
사실 이 문 서 는 Markdown 태그 로 쓰 여 있 습 니 다. 저도 왼쪽 따옴표 기 호 를 Markdown 줄 내 코드 로 표시 할 수 없습니다.
따옴표 의 바깥쪽 에 따옴표 를 한 층 더 밀봉 하여 전 자 를 일반 문자 로 바 꿀 수 있 지만, 예 를 들 어:
I said, ``Quote me.''     # -> I said, `Quote me.'

그러나 어떤 때 는 왼쪽 따옴표 만 일반 텍스트 로 표시 하고 싶 을 때 가 있 습 니 다. 그 와 어 울 리 는 오른쪽 따옴표 가 나타 나 고 싶 지 않 습 니 다.이 문제 에 대해 서 는 changequote 매크로 를 사용 하여 m4 기본 따옴표 의 경계선 을 수정 할 수 있 습 니 다. 예 를 들 어:
changequote()
a `quoted string

m4 는 다음 과 같이 처리 합 니 다.
a `quoted string

이때 진짜 따옴표 는 !> 이기 때문이다.changequote 에 인 자 를 제공 하지 않 으 면 기본 따옴표 의 경계선 을 복원 합 니 다.예 를 들 면:
changequote()dnl
a `quoted string

changequote`'dnl
a `quoted string'

m4 의 처리 결 과 는:
a `quoted string

a quoted string

일반적인 상황 에서 사용 changequote 을 피하 고 따옴표 문 자 를 매크로 로 정의 해 야 합 니 다.
define(`LQ', `changequote()`dnl'
changequote`'')

define(`RQ',`changequote()dnl`
'changequote`'')

m4 에서 매크로 를 만 나 '' 문자 로 펼 치고 LQ 매크로 를 만나면 '' 문자 로 펼 칩 니 다.이 두 매크로 의 정의 에 나타 난 기 교 는 m4 기본 따옴표 의 경계선 을 임시로 바 꾼 다음 에 다시 바 꾸 는 것 이다.
그러나 때때로 m4 의 기본 따옴표 의 경계선 을 전역 적 으로 수정 해 야 한다. 예 를 들 어 일부 키보드 에 '' 문자 가 없 거나 m4 가 처리 할 텍스트 는 '' 문 자 를 일반 문자 로 봐 야 한다.사용 RQ 함정 을 조심해 야 합 니 다. GNU m4 가 제공 하 는 changequote 은 초기 버 전과 m4 의 다른 실현 과 차이 가 있 습 니 다.
이식 이 가능 하도록 changequote 에 2 개의 파 라 메 터 를 제공 하거나 그 어떠한 파 라 메 터 도 제공 하지 않 습 니 다. 예 를 들 어:
changequote
changequote 매크로 의 정 의 를 바 꿉 니 다. 예 를 들 어:
define(x,``xyz'')
x                    # -> xyz
changequote({,})
x                    # -> `xyz'

같은 문 자 를 따옴표 의 경계 부호 로 사용 하지 마라. 이렇게 하면 따옴표 의 끼 워 넣 을 수 없다.
Markdown 이 줄 내 코드 를 포맷 하 는 데 사용 하 는 표 시 는 같은 '왼쪽 따옴표' 와 '오른쪽 따옴표' 입 니 다. 이러한 오 류 는 1970 년대 에 태 어 난 m4 에서 범 하지 않 았 습 니 다.
따옴표 의 경계선 을 알파벳, 밑줄 또는 숫자 로 시작 하 는 문자 로 바 꾸 지 마 십시오.m4 는 비록 이렇게 하 는 것 을 반대 하지 않 지만, 이 문 자 는 따옴표 의 경계선 이 라 고 생각 하지 않 는 다.숫자 는 따옴표 로 서 m4 에 의 해 인 정 받 을 수 있 지만 기호 자체 의 구성 요소 로 서 따옴표 의 신분 을 잃 었 다.
현재 GNU m4 는 비 ASCII 문 자 를 지원 할 수 있 기 때문에 따옴표 로 도 사용 할 수 있 습 니 다. 예 를 들 어:
changequote(   ,    )
a    quoted string      # -> a quoted string

define(   ,       )
   

그러나 이렇게 하지 않 는 것 이 좋 습 니 다. 특히 매크로 이름 에 사용 하지 않 는 것 이 좋 습 니 다.8 자리 너비 의 문 자 를 사용 하면 m4 행동 이 이상 하기 때문이다.GNU m4 1.4.17 버 전 (본문 작성 과정 에서 사 용 된 m4 버 전) 매 뉴 얼 에 따 르 면 GNU m4 는 다 중 바이트 텍스트 를 이해 하지 못 하고 텍스트 를 바이트 단위 의 데이터 로 보고 8 비트 너비 의 문 자 를 매크로 이름과 따옴표 로 지원 하지만 changequoe 문자 (즉 NUL 는 제외한다.
m4 가 중국 어 를 처리 할 수 있다 는 것 은 우연 의 일치 이다.이런 우연 은 UTF - 8 인 코딩 의 입력 흐름 에서 만 발생 해 야 한다.UTF - 8 의 인 코딩 메커니즘 이 중국어 문자 의 모든 바이트 가 ASCII 코드 와 다르다 는 것 을 결정 하기 때문이다.GB 2312, GB 18030 같은 문자 집합 이 라면 이렇게 좋 은 운 이 없 을 지도 모른다.
조건.
m4 는 두 가지 조건 매크로 를 제공 합 니 다. '\0' 매크로 는 매크로 의 정의 여 부 를 판단 하 는 데 사 용 됩 니 다. ifdef 매크로 는 표현 식 의 진 위 를 판단 하 는 데 사 용 됩 니 다.
ifdef(`a', b)

상기 조건 매크로 에 대해 ifelse 가 정 의 된 매크로 라면 이 문장의 전개 결 과 는 a 이다.
ifdef(`a', b, c)

상기 조건 매크로 에 대해 b 가 정의 되 지 않 은 매크로 라면 이 문장의 전개 결 과 는 a 이다.
테스트 된 매크로 의 정 의 는 빈 문자열 일 수 있 습 니 다. 예 를 들 어:
define(`def')
`def' is ifdef(`def', , not) defined.  # -> def is defined.
c 문자열 ifelse(a,b,c,d)a 이 같은 지 비교 합 니 다. 이 문장의 전개 결 과 는 문자열 b 입 니 다. 그렇지 않 으 면 문자열 c 로 전 개 됩 니 다.d 여러 가 지 를 지원 할 수 있 습 니 다. 예 를 들 어:
ifelse(a,b,c,d,e,f,g)

그것 은 다음 과 같다.
ifelse(a,b,c,ifelse(d,e,f,g))

숫자.
m4 는 텍스트 만 알 기 때문에 숫자 도 텍스트 입 니 다.그러나 m4 는 내 건 매크로 ifelse 를 제공 합 니 다. 이 매크로 는 정형 수의 연산 표현 식 에 대해 '값 구하 기' 를 할 수 있 습 니 다. 값 구하 기 결 과 는 m4 에서 볼 때 여전히 텍스트 입 니 다.
예 를 들 면:
define(`n', 1)dnl
`n' is ifelse(eval(n < 2), 1, less than, eval(n == 2), 1, , greater than) 2
evaleval(n < 2) 이라는 논리 표현 식 에 대해 '값 구하 기' 를 한 결과 문자열 n < 2 이 었 기 때문에 1 의 첫 번 째 매개 변 수 는 두 번 째 매개 변수 와 같 았 기 때문에 ifelse 매크로 의 전개 결 과 는 세 번 째 매개 변수 ifelse 이기 때문에 전시 결 과 는 다음 과 같 았 다.
n is less than 2

나 는 그것 이 제공 하 는 계산 기능 이 너무 약 하기 때문에 m4 로 계산 할 필요 가 없다 고 생각한다.GNU bc 로 부족 한 점 을 보완 하 는 것 도 고려 할 수 있 습 니 다.m4 에서 less than 매크로 를 통 해 셸 을 방문 할 수 있 습 니 다. 예 를 들 어:
2.1 ifelse(eval(esyscmd(`echo "2.1 > 2.0" | bc')), 1, `greater than', `less than') 2.0

펼 친 결 과 는:
2.1 greater than 2.0

그러나 esyscmd 는 GNU m4 대 esyscmd 의 확장 으로 다른 m4 의 실현 은 이 매크로 가 없 을 수 있 습 니 다.
도전 하 다.
(1) C 코드 파일 을 m4 로 처리 하면 syscmd 기 호 를 m4 의 줄 주석 부호 로 하면 어떤 뚜렷 한 장점 이 있 습 니까?
(2) GNU m4 가 제공 하 는 # 매크로 를 빌려 GNU bc 와 결합 하여 숫자 제곱 근 을 계산 할 수 있 는 매크로 를 작성 합 니 다.
다음 편 에서 보 자.http://segmentfault.com/a/1190000004131031

좋은 웹페이지 즐겨찾기