定义一个宏try
:
local try "a b c"
这将生成一个值为 的宏a b c
。
现在我想要一个新的宏try2
来接受 value da db dc
。也就是说,我想为旧宏的每个元素添加相同的前缀,并将其定义为新宏。
定义一个宏try
:
local try "a b c"
这将生成一个值为 的宏a b c
。
现在我想要一个新的宏try2
来接受 value da db dc
。也就是说,我想为旧宏的每个元素添加相同的前缀,并将其定义为新宏。
据我所知,官方Stata中没有专门支持该功能的功能。有关附近的功能,请参阅help macrolists
。
旧包listutil
(SSC)包括各种prelist
相关的命令。我写了那篇文章,所以并不是对其他人的工作持否定态度,这让我建议只应用一般技术。
local try "a b c"
local copy `try'
gettoken first copy : copy
while ("`first'" != "") {
local try2 `try2' d`first'
gettoken first copy : copy
}
di "try is {col 12} `try'"
di "try2 is{col 12} `try2'"
你也可以使用 Mata 来做到这一点。
local try "a b c"
mata: st_local("try2", invtokens("d" :+ tokens(st_local("try"))))
assert "`try2'" == "da db dc"
换句话说,这就是第二行的作用,首先解释最里面的函数:
st_local("try")
:访问局部变量中的内容。这应该评估为“ab c”。tokens("a b c")
:将字符串拆分为标记,例如tokens("a b c")
-> ("a", "b", "c")
。"d" :+ ("a", "b", "c")
: 在 Mata 中,你可以用 a 连接字符串+
,这里:+
是按元素来做的,所以结果是 ("da", "db", dc")。invtokens(("da", "db", dc"))
:将标记放回字符串中,即invtokens(("da", "db", dc"))
-> "da db dc"
。st_local("try2", "da db dc")
: Mata 等价于local try2 "da db dc"
.您可以了解更多关于 Mata 函数st_local()
、tokens()
和invtokens()
的信息,例如help mf_st_local
。