Я не совсем уверен, что вы ищете ... но вот несколько связанных моментов.Stata - это что-то вроде написания сценария оболочки Unix или пакетного файла 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 files» руководства.) Написание команды сродни написанию функции на других языках (например, MatLab)
Команда syntax
используется, чтобы помочь вамнаписать свою командуКогда вы выполняете команду, все, что следует за именем команды (command
выше), передается программе в локальном макросе `0'
.Синтаксическая команда анализирует этот локальный макрос, чтобы вы могли ссылаться на `varlist'
или `if'
и так далее.Теоретически, вы можете разобрать `0'
самостоятельно, но синтаксическая команда значительно облегчит вам и вашим пользователям (при условии, что вы следуете обычному синтаксису).Я привожу пример внизу.
Я не знаю точно, что вы подразумеваете под «очевидным отсутствием локальных переменных, как это известно в других языках».Макросы хранят одну строку или одно число в памяти. Вот комментарий Я написал о локальных / глобальных макросах Stata.Это действительно уникальная особенность языка программирования Stata.Как следует из их имен, «локальные» макросы доступны только в указанной программе (команде) или файле .do, в то время как «глобальные» макросы доступны во время сеанса Stata.
Я обнаружил, что, как только привык кМакросы в Stata, я начал скучать по ним на других языках.Они очень удобны.В дополнение к (локальному / глобальному) макросам и основному набору данных вы также можете хранить «вещи» в памяти с помощью команд scalar
и matrix
(и одной или двух других непонятных вещей).
Надеюсь, это поможет. Вот список ресурсов , которые могут помочь.
Пример:
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