![`m4`의 따옴표로 매크로 확장](https://linux55.com/image/148360/%60m4%60%EC%9D%98%20%EB%94%B0%EC%98%B4%ED%91%9C%EB%A1%9C%20%EB%A7%A4%ED%81%AC%EB%A1%9C%20%ED%99%95%EC%9E%A5.png)
에서는 m4
매크로를 확장하고 즉시 따옴표로 묶을 수 있습니까? 즉, 오히려
define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
MACRO
확장하면 다음 과 같은 Hello!
기능을 갖고 싶습니다 .qexpand
define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
qexpand(`MACRO')
HELLO
그러나 물론 문자열로 확장되는 처음 두 줄 이후의 다른 줄 도 작동 MACRO
합니다.
배경. patsubst
예를 들어 쉼표를 교체하여 매크로 확장을 바꾸고 싶습니다 . 안타깝게도
define(`MACRO',`x,y,z')dnl
patsubst(`MACRO',`,',`.')
x,y,z
문자열에 대해 교체가 수행되었기 때문에 생성됩니다 MACRO
. 그러나 매크로 확장에 쉼표가 포함된 경우 변형은
define(`MACRO',`x,y,z')dnl
patsubst(MACRO,`,',`.')
두 번째 줄은 먼저 로 확장되어 patsubst(x,y,z,`,',`.')
오류가 발생합니다 Warning: excess arguments to builtin `patsubst' ignored
. 매크로를 따옴표로 확장할 수 있으면 이 문제를 해결할 수 있습니다.
답변1
defn()
당신의 기능입니다 qexpand()
.
define(HELLO, `Hello!')dnl
define(MACRO, `HELLO')dnl
defn(`MACRO')
출력하고 HELLO
,
define(`MACRO',`x,y,z')dnl
patsubst(defn(`MACRO'),`,',`.')
출력됩니다 x.y.z
.
defn()
각 매개변수에 대한 참조 정의를 반환합니다. 위의 두 번째 예에서는 이것을 사용하여 인용된 문자열 x,y,z
( 인용된 값 MACRO
)을 얻습니다. 그런 다음 넘겨주면 patsubst
쉼표가 점으로 변경됩니다.
POSIX 표준m4
이 매크로에 대해 이런 말이 있습니다.
defn
매크로의 정의 텍스트는
defn
해당 인수의 참조 정의여야 합니다(현재 참조 문자열 사용). defn 뒤에 a 가 없으면<left-parenthesis>
동작이 지정되지 않습니다.
BSD의 m4
경우 defn()
매크로녹음됨~처럼
defn(name, ...)
각 매개변수에 대한 참조 정의를 반환합니다. 이는 매크로 정의의 이름을 바꾸는 데 사용할 수 있습니다(내장 매크로의 경우에도).
GNU m4
는 (m4
info
문서),
내장:
defn (NAME...)
다음으로 확장인용된 정의각
NAME
. 인수가 정의된 매크로가 아닌 경우 인수의 확장은 비어 있습니다.
NAME
사용자 정의 매크로의 경우 인용된 정의는 단순히 인용문의 확장된 텍스트입니다. 반대로, 하나만 있고NAME
내장 함수인 경우 확장은 내장 함수의 내부 정의를 가리키는 특수 태그입니다. 이 토큰은define
(and )에 대한 두 번째 인수 로만 의미가 있으며pushdef
대부분의 다른 컨텍스트에서는 빈 문자열로 자동 변환됩니다. 내장 함수를 다른 것과 결합하는 것은 지원되지 않습니다. 경고가 발생하고 내장 함수는 최종 확장에서 생략됩니다.매크로는
defn
매개변수로만 식별할 수 있습니다.