2

定义一个宏try

local try "a b c"

这将生成一个值为 的宏a b c

现在我想要一个新的宏try2来接受 value da db dc。也就是说,我想为旧宏的每个元素添加相同的前缀,并将其定义为新宏。

4

2 回答 2

2

据我所知,官方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'" 
于 2016-09-04T14:14:02.883 回答
1

你也可以使用 Mata 来做到这一点。

local try "a b c"
mata: st_local("try2", invtokens("d" :+ tokens(st_local("try"))))

assert "`try2'" == "da db dc"

换句话说,这就是第二行的作用,首先解释最里面的函数:

  1. st_local("try"):访问局部变量中的内容。这应该评估为“ab c”。
  2. tokens("a b c"):将字符串拆分为标记,例如tokens("a b c")-> ("a", "b", "c")
  3. "d" :+ ("a", "b", "c"): 在 Mata 中,你可以用 a 连接字符串+,这里:+是按元素来做的,所以结果是 ("da", "db", dc")。
  4. invtokens(("da", "db", dc")):将标记放回字符串中,即invtokens(("da", "db", dc"))-> "da db dc"
  5. st_local("try2", "da db dc"): Mata 等价于local try2 "da db dc".

您可以了解更多关于 Mata 函数st_local()tokens()invtokens()的信息,例如help mf_st_local

于 2016-10-16T10:16:17.340 回答