这个问题纯粹出于求知欲。
相对经常浏览 Python 部分后,我看到了许多与此类似的问题,其中有人要求以编程方式定义全局变量。他们中的一些人意识到 的陷阱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
to的值x100
被分配给本地宏x
。然后,循环内的行将 的平方分配i
给 的扩展x
,这是一个与 结尾相同的局部宏i
。也就是这个循环x4
展开到4^2后,又x88
展开到88^2。
在 Python 中,做类似事情的方法是:
squares = {}
for x in range(1,101):
squares[x] = x**2
然后squares[7]
等于 7^2。
这是一个非常简单的例子。stata 宏还有很多其他用途。您可以将它们用作传递要评估的函数的一种方式,例如:
local r1 "regress"
local r2 "corr"
foreach r of varlist r1-r2 {
``r'' y x
}
周围的双刻度线r
将该宏扩展了两次,首先是r1
/r2
然后是regress
/ corr
,结果是运行线性回归,y
作为因变量和x
作为自变量,然后显示 和 之间的相关y
性x
。更复杂的东西是可能的。
我的问题基本上是,stata 是否属于更大的语言类别,其中变量赋值/评估采用这种“宏赋值/扩展”形式?任何解释为什么会这样设计一种语言,和/或其他语言中类似结构的例子的加分点。