Stata编程语言没有语法?

时间:2011-05-10 13:54:49

标签: programming-languages language-features stata

我最近从程序/ OO /功能背景进入Stata,并且无法理解该语言的基本元素。

例如,我发现有一个syntax命令“允许程序根据语法解释用户输入的参数,例如标准的Stata语法”。我推断这就是为什么某些命令要求作为参数给出的变量列表由空格分隔而其他命令需要以逗号分隔的列表的原因。但是,定义自己的语法而不是强制执行(参数)语法的程序的想法似乎很奇怪。

另一个非常有趣的构造是宏定义和扩展(`macro')的语法,以及其他语言中已知的局部变量的明显缺失。

是否有类似“Stata for Java developers”的文档向具有我背景的人解释该语言的基本概念?

PS:如果这个问题似乎不清楚,请道歉。不幸的是,我现在无法提出更具体/明确的问题:(

2 个答案:

答案 0 :(得分:9)

我不确定你在寻找什么......但这里有一些相关的观点。 Stata有点像编写Unix shell脚本或Windows批处理文件。每行执行一个命令,第一个单词是命令名。按照惯例,大多数命令具有以下结构:

command [varlist] [=exp] [if expression] [in range] [weight] [using filename] [, options]

Brackets [。]表示它是可选的(或不可用,具体取决于命令)。某些命令可以加上前缀(例如by:xi:svy:)Stata Corp和有经验的用户的命令语法非常一致。但是,因为Stata用户也会编写命令,所以偶尔会看到一些古怪的东西。

当Stata用户编写命令时,它们将保存在.ado文件中(而不是.do),并使用program命令进行定义。 (请参阅本手册的help program和“Ado文件”部分。)编写命令类似于用其他语言编写函数(例如,MatLab)

syntax命令用于帮助您编写自己的命令。执行命令时,命令名称(上面的command)后面的所有内容都将传递给本地宏`0'中的程序。 syntax命令解析此本地宏,以便您可以引用`varlist'`if',依此类推。理论上,您可以自己解析`0',但语法命令使您和您的用户更容易(只要您遵循传统语法)。我在底部举了一个例子。

我不清楚你的意思是“明显缺少其他语言中已知的局部变量”。宏在内存中存储单个字符串或单个数字。 Here's a comment我写了关于Stata的本地/全局宏的文章。它们确实是Stata编程语言的独特功能。顾名思义,“本地”宏仅在指定程序(命令)或.do文件中可用,而“全局”宏在整个Stata会话中可用。

我发现,一旦我习惯了Stata中的宏,我开始想念其他语言的宏。它们非常方便。除了(本地/全局)宏和主数据集之外,您还可以使用scalarmatrix命令(以及一两个其他模糊的东西)将“内容”存储在内存中。

我希望有所帮助。 Here's a list resources可能有所帮助。

示例:

program define myprogram
    syntax varlist [if], [hello(string) yes]
    macro list _0 _varlist _if _hello _yes 
    summarize `varlist' `if'
    display "Here's the string in my hello option: `hello'"
    if !missing("`yes'") di "Yes is on"
    else                 di "Yes is off"
end 

sysuse auto.dta    
myprogram rep78 headroom if price > 5000 , hello("world") yes

答案 1 :(得分:1)

一些书提供了“X for Y users”方法,但通常在stats软件解决方案之间。关于你的问题,我建议先使用本能。

大约十年前我开始阅读(编程和标记)代码,即使我不能用大量语言编写代码,我也可以轻松地阅读几种语言。我发现Stata很简单,因为它的大多数核心命令都很简单,使用易于理解的重复可选语句,如overifreplace(采用自愿多样的语句集)然后申请。

当我教Stata时,我总是在让学生像我一样使用help页面时遇到问题(我喜欢他们可以如此轻松地访问它们,就像在R中一样)。我通过考虑我可以直接读取语法指示的事实来解释这个悖论。前面对你的问题的回复很好地涵盖了语法。

额外的里程包括打开utilities文件夹中Stata附带的[R],[U]和特别是[P]手册。那里有大量的细节,这将使程序员和培训统计人员都感兴趣。这是我学会使用宏和循环的地方,除了local / globalforeach / while之类的命令的明显逻辑之外(如果我理解正确的话,Stata是图灵完整的。)

在宏循环中使用单引号或双引号时,Stata有时会有点痛苦,但是它非常简单。玩得开心!