Stata是否是图灵完备的?

5

最近我一直在使用Stata进行统计工作,但并不是很喜欢。

我觉得它不像一个“正式”的编程语言:特别是我认为没有一种方法可以循环直到满足条件。

我的感觉是正确的吗?还是说Stata确实是图灵完备的?

5个回答

3
我以前从未听说过Stata,但网页夸耀它拥有“if, while”和“looping and branching”。
Wikibooks有this example
local k = 1
file open myfile using toto.txt, read text
file read myfile line
while r(eof) == 0 {
    local k = `k' + 1
    di "`k' `line'"
    file read myfile line
    }
file close myfile

我不知道什么是“适当的”编程语言,但乍一看它肯定是图灵完备的。

我完全错过了Stata有while循环的事实!非常感谢。 - Tom Smith
我不知道为什么“brag”被认为是一个合适的词在这里。 - Nick Cox

1
一个“合适”的编程语言,可以用它来构建网页或GUI吗?当然不是。但这有点极端了。你肯定可以使用 .ado 和 .do 文件编写循环;我会说它是图灵完备的。

1
你可以使用它来构建网页或图形用户界面,但这并不是一个理想的平台,而且它非常有限。例如,我可以使用“file”命令编写网页的HTML代码,使用SSC中的“estout”或“tabout”编写网页的表格,或者使用“window”子命令在Stata环境中编写GUI。请参见在世界银行网站上使用Stata Numerics编写的ADEPT程序/ GUI(http://tinyurl.com/stataadept)。 - eric.a.booth

1

Stata的ado语言具有所有通常的条件语句:

然而,重要的是不要混淆两者:

此外,Stata的ado语言循环结构包括:

Mata,Stata的矩阵编程语言也支持以下内容:

因此,Stata的adomata编程语言似乎都满足被描述为Turing完备的标准。需要注意的是,这些不是通用编程语言,而是完整的统计语言。

0

虽然您可以使用 -while-,-if-,-else- 命令执行循环直到满足条件,但在 Stata 中,通常最好使用 -foreach- 或 -forvalues- 循环来代替它们。
因此,不要说:

while "`1'" != "" {
<do something>
} 

或者

if "`a'" == "" {
<do something>
}
else {
<do something else>
}

通常最好的做法(也更直观)是这样做:

forvalues x = 1/100 {
<do something>
}

-- 不需要 -if-, -else- 或 -break- 条件。请参阅 Stata 中的 -help forvalues- 或 -help foreach- 以获取详细信息。


注意:我的原始帖子中的while-else循环已被删除--感谢Keith提醒。-else-部分仅适用于if{] else{}循环示例。无论如何,我发帖的目的并不是建议使用while/else或if/else循环,而是-foreach-/-forvalues-通常是更好的方法。


0

@eric.a.booth:我觉得你的例子很奇怪。我不确定我曾经见过while { ... } else {...}

此外,请注意,Stata在运行循环之前不会测试循环,并且允许自己陷入无限循环。

local x = 0
while `x'<5 {
   display `x' / 2
   local ++x
}

我在我的帖子中修复了while-else错误,再次感谢。 我只想让-else-与-if-示例一起使用。 对于您的第二个评论,我不明白您的示例如何使Stata进入无限循环(?)如果您省略了宏扩展(++i或-macro shift-甚至是-continue,break-)命令,那么它将进入无限循环,但这与用户手册中[P]-while-的指南相矛盾。 - eric.a.booth
我试图提供一个有用的例子。因此,我指出需要使用类似++x(以避免无限循环)的东西。 - Keith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接