什么类型的语言允许以编程方式创建变量名称?

时间:2011-03-04 04:45:10

标签: python variable-assignment stata stata-macros

这个问题完全出于好奇心。

相对经常浏览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为自变量,然后显示xy之间的相关性。更复杂的东西是可能的。

我的问题基本上是,stata是否属于一些较大的语言类别,其中变量赋值/评估采用这种形式的“宏分配/扩展”?对于为什么语言会像这样设计的任何解释和/或其他语言中类似结构的示例的加分点。

4 个答案:

答案 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'
}

在第二个例子中犯了同样的错误。 r1r2不是变量。 你可以这样做:

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
相关问题