Loops 生成新宏,为旧宏的单词添加前缀

Loops 生成新宏,为旧宏的单词添加前缀,loops,stata,stata-macros,Loops,Stata,Stata Macros,定义宏尝试: local try "a b c" 这将生成一个值为abc的宏 现在我需要一个新的宏try2,它接受值da db dc。也就是说,我想为旧宏的每个元素添加相同的前缀,并将其定义为一个新宏。据我所知,在官方统计中没有专门支持此功能的函数。有关附近的函数,请参阅帮助宏列表 旧软件包listutil(SSC)包含各种命令,prelist是相关的。我写了这篇文章,所以我建议只使用一般的技巧,而不是对别人的工作持消极态度 local try "a b c" local copy `try

定义宏
尝试

local try "a b c"
这将生成一个值为
abc
的宏


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

据我所知,在官方统计中没有专门支持此功能的函数。有关附近的函数,请参阅帮助宏列表

旧软件包
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”)
    :访问局部变量中的内容。这应评估为“a b c”
  • tokens(“abc”)
    :将字符串拆分为令牌,例如
    令牌(“abc”)
    ->
    (“a”、“b”、“c”)
  • “d”:+(“a”、“b”、“c”)
    :在Mata中,您可以将字符串与
    +
    连接起来,这里
    :++
    按元素顺序执行此操作,因此结果将是(“da”、“db”、“dc”)
  • invtokens((“da”、“db”、“dc”))
    :将令牌放回字符串中,即
    invtokens((“da”、“db”、“dc”)
    ->
    “da db dc”
  • st_local(“try2”、“da db dc”)
    :与
    local try2“da db dc”相当的Mata

  • 您可以通过
    help mf\u st\u local

    @sxgn了解有关Mata函数
    st\u local()
    tokens()
    invtokens()
    的更多信息。如果这有帮助,您可以使用左侧的复选标记选择此作为答案。