在访问变量之前,我希望能够测试是否定义了变量。
我希望有一个全局指定“调试级别”。如果调试级别为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遵从性)。
编辑--我尝试用一个guard包装eval,比如:
(guard (x (else #f)) (eval 'debug-level))由于引用了'debug-level,所以可以对其进行计算并将其传递给eval。然后,当eval试图计算它时,会发生一个错误,我希望guard能捕捉到这个错误。事实并非如此。
编辑2我意识到我想将调试跟踪封装到一个单独的过程中,并且定义该过程的文件也可以定义默认为0的debug-level。使用分离过程的原因是为了降低过程中工作的行数,并允许在需要时重定向调试输出。
发布于 2010-07-17 03:51:31
R5RS笨重但可行的解决方案。利用let语法经常被忽略/遗忘的能力来重新定义关键字。这很笨重,因为整个文件都是用let语法包装的,还因为它为每个定义增加了一些开销。我使用关联列表来记住定义,哈希表将是一个更好的选择。
(define define-list '())
(define define-list-add
(lambda (key value)
(set! define-list (cons `(,key ,value) define-list))))
(let-syntax (
(define (syntax-rules ()
((_ (pro-name args ...) body ...)
(begin
(define (pro-name args ...) body ...)
(define-list-add pro-name '((pro-name args ...) body ...))))
((_ pro-name pro) (begin
(define pro-name pro)
(define-list-add 'pro-name 'pro)))
))
(defined?
(syntax-rules ()
((_ sym) (begin (if (assoc (quote sym) define-list) #t #f)))))
)
(define y (lambda () x))
(display (defined? y))
(newline)
(display (defined? x))
)版画
#t
#f下面在球拍:一个模块是用来重新定义定义,以存储每个符号和定义在一个列表,称为定义-列表。宏定义的?在此列表中查看是否定义了天气符号。
(module qdefine mzscheme
(provide ;(all-from-except mzscheme let)
(rename define olddefine)
(rename quote-define define)
defined?)
(define define-list '())
(define define-list-add
(lambda (key value)
(set! define-list (cons `(,key ,value) define-list))))
(define-syntax quote-define
(syntax-rules ()
((_ (pro-name args ...) body ...)
(begin
(define (pro-name args ...) body ...)
(define-list-add pro-name '((pro-name args ...) body ...))))
((_ pro-name pro) (begin
(define pro-name pro)
(define-list-add 'pro-name 'pro)))
))
(define-syntax defined?
(syntax-rules ()
((_ sym) (begin (if (assoc (quote sym) define-list) #t #f)))))
)
(require 'qdefine)
(define y (lambda () x))
(defined? y)
(defined? x)在诡计中它只是定义?显然:289.html
发布于 2010-07-16 19:03:50
要备份一点,defined?函数的问题是如果您编写
(defined? debug-level)方案将尝试计算debug-level,这当然是一个错误,因为它没有定义。这种形式必须由编译器/解释器作为特例在内部实现。
这样一个特殊的表单不是R5RS标准的一部分(除非我错过了它,请复核)。因此,对于R5RS方案,除非您找到一个将其作为非标准扩展来实现的方案,否则您将不走运。
https://stackoverflow.com/questions/3267351
复制相似问题