这个问题纯粹出于求知欲。
在经常浏览Python部分后,我看到了许多与this类似的问题,其中有人要求以编程方式定义全局变量。他们中的一些人意识到exec
的陷阱,其他人则没有。
但是,我最近一直在Stata编程,其中以下是常见的:
local N = 100
local i = 1
foreach x of varlist x1 - x`N' {
local `x' = `i' * `i'
++i
}
在Stata的说法中,创建了一个名为N
的局部宏,N
的计算结果为100.在foreach
循环的每次迭代中,将x1
到x100
的值分配给局部宏x
。然后,循环内的线,将i
的平方分配给x
的扩展,i
是一个与x4
结尾相同的局部宏。也就是说,在此循环之后,x88
扩展到4 ^ 2并且squares = {}
for x in range(1,101):
squares[x] = x**2
扩展到88 ^ 2。
在Python中,做类似的事情的方法是:
squares[7]
然后local r1 "regress"
local r2 "corr"
foreach r of varlist r1-r2 {
``r'' y x
}
等于7 ^ 2。
这是一个非常简单的例子。 stata宏还有很多其他用途。您可以使用它们作为传递要评估的函数的方法,例如:
r
r1
周围的双重标记将该宏扩展两次,首先扩展到r2
/ regress
然后再扩展到corr
/ y
,结果以x
作为依赖和y
作为自变量进行线性回归,然后显示x
和local x3 = 20
local y = 3
display "I am `x`y'' years old"
之间的相关性。更复杂的东西是可能的。
我的问题基本上是,stata是否属于一些较大的语言类别,其中变量赋值/评估采用这种形式的“宏分配/扩展”?对于为什么要像这样设计语言和/或其他语言中类似结构的示例的任何解释的加分点。
这真的只是一个有多少语法糖的问题。在任何值得它的语言中,您可以使用地图或字典数据结构在运行时创建具有某个值的变量名称(键)。有些语言可能比其他语言更透明地将其与普通变量标识符集成。
(对不起,这是一个“答案”,而不是评论....人们不评价我的答案,所以我没有足够的分数来评论这个问题。)
首先,让我指出Stata的一个奇怪之处在于它在执行代码行之前转换宏。例如:
说你输入。
display
在内部,Stata将翻译本地(内部到外部),然后执行display "I am `x3' years old"
命令。也就是说,Stata将翻译命令
display "I am 20 years old"
然后
set trace on
然后,Stata将实际执行最后一行代码。您可以通过首先执行以下命令来观察所有这些:` '
。
有一个微妙的区别。 ` '
括号更改命令。我认为这实际上与其他编程语言不同。您通常可以在Stata中使用一行代码执行某些操作,其他语言需要两行代码(一行用于“扩展”宏;一行用于执行代码行)。
对此有用的是,Stata还可以评估display "I am `= 2011 - 1991' years old"
display "I am `= floor(uniform()*`x`y'')' years old"
括号内的所有类型的表达式(只要它们返回一个数字或字符串......例如,没有任何返回矩阵)
%let
一旦你习惯了,这非常有用。宏使用Stata的方式比你做的更干净,例如SAS。 SAS的x1, x2, ... , x100
声明并不是那么灵活。
我还要指出一些错误。
(1)在这些例子中,循环设置错误。 foreach x of varlist x1 - x100
是宏(本地人),而不是变量。你不能说x1-x100
因为local N = 100
forvalues i = 1/`N' {
local x`i' = `i' * `i'
}
不是变量列表。如果我试图这样做,我可能会使用:
r1
在第二个例子中犯了同样的错误。 r2
和local mycommands regress corr
foreach r in `mycommands' {
`r' y x
}
不是变量。你可以这样做:
foreach r of local mycommands { ... }
(虽然我实际上会输入等效的++i
,据说可以更快地执行头发)。
(2)其次,local ++i
无效。你可能想说for ($i=0; $i<10; $i++) {
${x.$i} = $i*$i;
}
print $x3; // prints 9
print $x4; // prints 16
。
我不知道这是不是你要找的,但在PHP中你可以这样做:
for(var i = 0; i < 100; i++)
this["var" + i] = i * i;
alert(var8); // 64
我个人认为这非常不愉快。
Javascript是一个明显的例子,虽然机制就像Python,而不是Stata。
qazxswpoi