宏中可怕的复合引用

Dreaded compound quoting in macros

我认为自己是高级 Stata 用户,但我就是不知道如何让复合引号对我有用。

我有两个宏,每个宏都包含复合引号列表,例如`"name with space"' `"nospace"'。我不知道如何将这些字符串块视为 space 分隔列表。

如果我创建一个不带引号的本地文件,它看起来像是一个由 space 分隔的列表。例如,

 local test a b

. di "`test'"
a b

但是如果我将它们放在复合引号中,我会得到非常不同的结果:

. local test `"a"' `"b"'

. di "`test'"
a' invalid name
r(198);

. di `"`test"'
ab

如果我想将字符串块视为单独的项目,这就是一个问题,如下所示:

local set1 `"name with space"' `"nospace"'

. di `"`set1'"'
name with spacenospace

如何使宏成为字符串块列表(有或没有 spaces),由 spaces 分隔?我最终想迭代地构建这样一个宏,并用它来命名矩阵中的行。

我不知道这是否回答了你所有的问题。也许编辑问题并删除有关矩阵的所有内容。据我了解,您的问题是关于字符串和矩阵的,而恰好是您问题的背景。但我可能错了。如果您的问题仅与字符串有关,那么专注于字符串的可重现示例将提高您获得完整答案的机会。

local set1 `"name with space"' `"nospace"' 中,您连接了两个字符串 "name with space""nospace",但您没有告诉 Stata 在这些字符串之间添加 space。 Stata 不会在您未告知的情况下在这些字符串之间添加任何内容。

例如,您可以这样做:

local set1 `"name with space"' `" "' `"nospace"'
di `"`set1'"'

或:

local set1 `"name with space"' `" nospace"'
di `"`set1'"'

或者保存一串字符串:

local set1 `" "name with space" "nospace" "'
di `"`set1'"'