如何在引用变量之前测试变量是否已定义?

Sha*_*nce 6 scheme

我希望能够在访问变量之前测试变量是否已定义.

我喜欢有一个指定"调试级别"的全局.如果调试级别为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合规)

编辑我尝试evalguard类似的包装:

(guard (x (else #f)) (eval 'debug-level))
Run Code Online (Sandbox Code Playgroud)

'debug-level引用以来,它可以被评估并传递给eval.然后当eval试图评估它时,会发生错误,我希望guard会发现错误.它没有.

编辑2我意识到我想将调试跟踪包装成一个单独的过程,并且定义该过程的文件也可以debug-level使用默认值0 定义.使用单独过程的原因是降低过程中的行数这工作,并允许重新定向调试输出,如果需要.

Nie*_*jou 4

这完全取决于实现来提供,并且看起来大多数实现都不能令人满意地提供它。

在 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,你有顶级绑定吗?再次是交互环境。