`m4`의 따옴표로 매크로 확장

`m4`의 따옴표로 매크로 확장

에서는 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매개변수로만 식별할 수 있습니다.

관련 정보