我希望能够在访问变量之前测试变量是否已定义。
我喜欢有一个指定“调试级别”的全局变量。如果调试级别为 0,则不会给出额外的输出。当大于 1 时,将给出调试输出,数字越大,输出越详细。
我还想对其进行设置,以便程序能够运行,并假定级别为 0(如果我没有抽出时间来定义它)。像这样的东西:(其中defined?
是我不知道怎么做的魔法吗?
(if (and (defined? debug-level) (> debug-level 1))
(diplay "Some debugging info"))
我已经浏览了表格摘要方案编程语言,第四版 http://scheme.com/tspl4/summary.html#./summary:h0。我认为唯一一种可能性是identifier?
。它不起作用。
我正在使用 SISC 1.16.6(声称符合 R5RS 要求)和 Chez Petite Scheme v8(声称符合 R6RS 要求)
EDIT我尝试包裹eval
with a guard
like:
(guard (x (else #f)) (eval 'debug-level))
Since 'debug-level
被引用它可以被评估并传递给eval
。那么当eval
尝试评估它,会发生错误,这是我希望的guard
会抓住。事实并非如此。
EDIT 2我意识到我想将调试跟踪包装到一个单独的过程中,并且定义该过程的文件也可以定义debug-level
默认值为 0。使用单独过程的原因是减少过程中有效的行数,并允许在需要时重定向调试输出。
这完全取决于实现来提供,并且看起来大多数实现都不能令人满意地提供它。
In SISC scheme, it looks like you can use GETPROP http://sisc-scheme.org/manual/html/ch03.html#SymbolicEnvironments to this effect, but environments don't update automatically oh, look, there's this thing called INTERACTION-ENVIRONMENT that you can use:
#;> (getprop 'cons (interaction-environment))
#<native procedure cons>
#;> (getprop 'x (interaction-environment))
#f
#;> (define x 100)
#;> (getprop 'x (interaction-environment))
100
但它只适用于顶层。
#;> (define (foo y)
(let ((e (interaction-environment)))
(display "Is X bound? ") (display (getprop 'x e))
(newline)
(display "Is Y bound? ") (display (getprop 'y e))
(newline) ))
#;> (foo 1)
#;> Is X bound? 100
Is Y bound? #f
对于Chez你有顶级限制? http://www.scheme.com/csug8/binding.html#./binding:h5再次是交互环境。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)