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