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