C 如何重新扫描m4数据以进行递归宏就地替换

C 如何重新扫描m4数据以进行递归宏就地替换,c,bash,unix,macros,m4,C,Bash,Unix,Macros,M4,我有一个非常简单的代码 define(`S',`some') define(`T',`thing') define(`D',`doing') define(`something',`st_todo') define(`st_tododoing',`done!') S`'T OR S()T() 实际的最终结果是 something OR something 但预期的递归替换结果如下 st_todo 如何将代码重新扫描到输入 也许是“indir”,但这是一个扭曲的肮脏解决方案:

我有一个非常简单的代码

define(`S',`some')
define(`T',`thing')
define(`D',`doing')
define(`something',`st_todo') 
define(`st_tododoing',`done!')
S`'T 
OR 
S()T() 
实际的最终结果是

something 
OR 
something 
但预期的递归替换结果如下

st_todo
如何将代码重新扫描到输入

也许是“indir”,但这是一个扭曲的肮脏解决方案:

indir(S()`'T()`'D())
结果是:

--NOTHING--
也许所谓的命令“分流”,可以使输出,回收到输入

当然,评论说这是“就地宏观替代”, 但结果是不同的

当然我们可以用“C”语言原语宏解决。例如:

define(`concat',`$1$2$2$4$5')
但这种“concat”解决方案,将在大型代码重构中增加代码嵌套的复杂性。例如:

concat(concat(S1,T1),concat(S2,T2,more1,more2,...))
如果我们有10个或更多单词的“concat”或带有条件句“ifelse”

M4概念超越了旧的“C”预处理器

真正的解决方案必须来自宏观的“核心系统内部”


有什么想法吗?

M4会重新扫描。但是,空字符串
`
结束前面的标记,从而防止
某些
事物
被识别为单个标记

而是使用另一个宏连接宏展开:

define(`concat',`$1$2')
define(`S',`some')
define(`T',`thing')
define(`something',`st_todo') 
concat(S,T)
$m4定义(`S',`some')dnl
>定义('T','thing')dnl
>定义('something','st_todo')dnl
>康卡特(S,T)
>EOF
圣托多

S()T=>someT的结果。@contenta:Oops。好的,一个更复杂的解决方案。这引发了另一个问题:
S()T
为什么不展开T?m4解析最终的
后,宏扩展完成。它应该读取
T
并展开。这是“C”原语宏解决方案!这个“concat”解决方案,使得它非常复杂,在一个大的代码重构中。M4概念超越了“C”预处理器!!!。如果我们有10个单词的“concat”呢?。真正的解决方案必须是宏观的“核心系统”。@contenta我不理解你的评论。但是请注意,与rici使用的
concat
不同,您可以使用内置的
indir
并编写
indir(S[]T)
。(我将引号改为[]以避免如此注释标记)。
$ m4<<"EOF"
> define(`concat',`$1$2')dnl        
> define(`S',`some')dnl
> define(`T',`thing')dnl
> define(`something',`st_todo')dnl
> concat(S,T)
> EOF
st_todo