Stata 自定义程序调试语法

Stata 自定义程序调试语法,stata,Stata,我创建了下面的程序,它不能很好地处理字符串表达式。我还没有找到正确的调整方法来添加语法定义,以使其按预期工作 我认为这是一件小事,但我还没能把它做好。或者,如果您提到一些有帮助的东西,我们也将不胜感激 包括产生相同错误的程序和一些伪代码 谢谢 cap program drop repl_conf program define repl_conf syntax varlist =exp [if] qui count `if' if r(N) ==0 { di a

我创建了下面的程序,它不能很好地处理字符串表达式。我还没有找到正确的调整方法来添加语法定义,以使其按预期工作

我认为这是一件小事,但我还没能把它做好。或者,如果您提到一些有帮助的东西,我们也将不胜感激

包括产生相同错误的程序和一些伪代码

谢谢

cap program drop repl_conf
program define repl_conf
    syntax varlist =exp  [if] 
    qui count `if'
    if r(N) ==0 {
    di as err "NO MATCHES -- NO REPLACE"
    exit 9
    }
    else {
    noi dis "SUCCESSFUL REPLACE of >=1 OBS -- " r(N) " OBS replaced"
    qui replace `varlist' `exp' `if'
    }
end

sysuse auto, clear
repl_conf length=999 if length==233
repl_conf make="ZZZ" if make=="AMC Concord"
type mismatch
r(109);

这更进一步。我移动了第二条消息,因此只有在
替换成功时才会发出该消息

program define repl_conf
    gettoken varname 0 : 0, parse(=) 
    confirm var `varname' 
    gettoken eq 0 : 0, parse(=) 
    syntax anything [if] 
    qui count `if'
    if r(N) == 0 {
         di as err "NO MATCHES -- NO REPLACE"
         exit 9
    }
    else {
         qui replace `varname' = `anything' `if'
         noi di "SUCCESSFUL REPLACE of >=1 OBS -- " r(N) " OBS replaced"
    }
end

sysuse auto, clear
repl_conf length=999 if length==233
repl_conf make="ZZZ" if make=="AMC Concord"

我认为这里只能是一个带有数值结果的表达式。当提供带有字符串结果的语句时,您的程序没有传递
语法
语句。我想您需要使用
gettoken
逐个剥离命令行中的标记。这似乎是一个不幸的功能
replace
gen
都可以使用字符串或数字
exp
s,但它们都是内置命令。非常感谢,@NickCox。这很有效&帮助我修复了
gettoken
语法,我后来遇到了问题。