我不完全确定你在寻找什么......但这里有一些相关的观点。Stata 有点像编写 Unix shell 脚本或 Windows 批处理文件。每行执行一个命令,第一个单词是命令名。按照惯例,大多数命令具有以下结构:
command [varlist] [=exp] [if expression] [in range] [weight] [using filename] [, options]
方括号 [.] 表示它是可选的(或不可用,取决于命令)。有些命令可以加前缀(例如by:
、xi:
或svy:
)。Stata Corp 和有经验的用户的命令语法非常一致。但是,因为 Stata 用户也会编写命令,所以您偶尔会看到一些古怪的东西。
当 Stata 用户编写命令时,它们会保存在 .ado 文件(不是 .do)中,并使用program
命令进行定义。(参见help program
手册的“Ado 文件”部分。)编写命令类似于用其他语言(例如 MatLab)编写函数
该syntax
命令用于帮助您编写自己的命令。当您执行命令时,命令名称(command
上面)后面的所有内容都将传递给本地宏中的程序`0'
。语法命令解析这个本地宏,以便你可以引用`varlist'
或`if'
等等。理论上,您可以`0'
自己解析,但语法命令让您和您的用户更容易(只要您遵循常规语法)。我在底部放了一个例子。
我不知道您所说的“明显没有其他语言中已知的局部变量”是什么意思。宏在内存中存储单个字符串或单个数字。 这是我写的关于 Stata 的本地/全局宏的评论。它们确实是 Stata 编程语言的一个独特功能。正如它们的名字所暗示的那样,“本地”宏仅在指定程序(命令)或 .do 文件中可用,而“全局”宏在整个 Stata 会话中可用。
我发现,一旦我习惯了 Stata 中的宏,我就开始怀念其他语言的宏。它们非常方便。除了(本地/全局)宏和主数据集之外,您还可以使用scalar
andmatrix
命令将“事物”存储在内存中(以及一两个其他晦涩的事物)。
我希望这会有所帮助。 这是一个可能有帮助的资源列表。
例子:
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