我希望能够在访问变量之前测试变量是否已定义.
我喜欢有一个指定"调试级别"的全局.如果调试级别为0,则不会给出额外的输出.当大于1时,给出调试输出,更大的数字更详细.
我还想设置它以便程序运行,如果我没有定义它,则假设级别为0.有点像:( defined?魔法在哪里,我不知道怎么办?
(if (and (defined? debug-level) (> debug-level 1))
(diplay "Some debugging info"))
Run Code Online (Sandbox Code Playgroud)
我查看了The Scheme Programming Language,4th Edition中的表单摘要.我认为唯一可能的是identifier?.那没起效.
我正在使用SISC 1.16.6(索赔R5RS合规)和Chez Petite Scheme v8(索赔R6RS合规)
编辑我尝试eval用guard类似的包装:
(guard (x (else #f)) (eval 'debug-level))
Run Code Online (Sandbox Code Playgroud)
自'debug-level引用以来,它可以被评估并传递给eval.然后当eval试图评估它时,会发生错误,我希望guard会发现错误.它没有.
编辑2我意识到我想将调试跟踪包装成一个单独的过程,并且定义该过程的文件也可以debug-level使用默认值0 定义.使用单独过程的原因是降低过程中的行数这工作,并允许重新定向调试输出,如果需要.
这完全取决于实现来提供,并且看起来大多数实现都不能令人满意地提供它。
在 SISC 方案中,看起来您可以使用GETPROP来达到此效果,但环境不会自动更新哦,看,有一个叫做交互环境的东西你可以使用:
#;> (getprop 'cons (交互环境)) #<本机过程缺点> #;> (getprop 'x (交互环境)) #F #;>(定义 x 100) #;> (getprop 'x (交互环境)) 100
但它只适用于顶层。
#;>(定义(foo y)
(让 ((e (交互环境)))
(display "X 是否已绑定?") (display (getprop 'xe))
(新队)
(display "Y 是否已绑定?") (display (getprop 'ye))
(新队) ))
#;> (富1)
#;> X 是否已绑定?100
Y 是否受约束?#F
对于Chez,你有顶级绑定吗?再次是交互环境。