我正在使用名为flow
的.ado文件。如果用户键入flow i
,我希望运行一个if
语句。如果用户键入flow e
,我希望运行另一个if
语句。
我该怎么做?
答案 0 :(得分:3)
此论坛的许多读者希望看到您尝试的一些代码....
program flow
version 8 // will work on almost all Stata in current use
gettoken what garbage : 0
if "`what'" == "" | "`garbage'" != "" | !inlist("`what'", "e", "i") {
di as err "syntax is flow e or flow i"
exit 198
}
if "`what'" == "e" {
<code for e>
}
else if "`what'" == "i" {
<code for i>
}
end
最后一个if
条件是多余的,因为我们已经确定用户已键入e
或i
。根据口味编辑出来。
答案 1 :(得分:2)
鉴于你对@NickCox的答案发表评论,我认为你尝试过这样的事情:
program flow
version 8
syntax [, i e]
if "`i'`e'" == "" {
di as err "either the i or the e option needs to be specified"
exit 198
}
if "`i'" != "" & "`e'" != "" {
di as err "the i and e options cannot be specified together"
exit 198
}
if "`e'" != "" {
<code for e>
}
if "`i'" != "" {
<code for i>
}
end
之后,您可以这样致电flow
:flow, i
或flow, e
。注意逗号,现在这是必要的(但不是@NickCox的命令)因为你做了选项。
答案 2 :(得分:1)
如果您希望i
和e
是互斥选项,那么这是另一种选择:
program flow
version 8
capture syntax , e
if _rc == 0 { // syntax matched what was typed
<code for e>
}
else {
syntax , i // error message and program exit if syntax is incorrect
<code for i>
}
end
如果每个分支中的代码都很长,那么很多人会更喜欢每个案例的子程序作为一种好的风格,但这与这里的草图一致。请注意,在每个syntax
语句中,该选项都是强制性的。
capture
的效果是:错误不是致命的,而是由capture
“吃掉”。因此,您需要查看可在_rc
中访问的返回码。 0 _rc
总是表示命令成功。非零始终表示命令不成功。在这里,通常在其他地方,命令只有两种方法是正确的,所以我们不需要知道_rc
是什么;我们只需要检查其他合法语法。
请注意,即使我的两个答案在风格上也不同,用户输入非法命令是获取信息性错误消息还是只是“无效语法”。对此的上下文是期望每个Stata命令都附带一个帮助文件。一些程序员假设帮助文件解释了语法;其他人希望他们的错误消息尽可能有用。