首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在引用变量之前测试是否定义了变量?

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

Stack Overflow用户
提问于 2010-07-16 17:20:15
回答 2查看 2.9K关注 0票数 6

在访问变量之前,我希望能够测试是否定义了变量。

我希望有一个全局指定“调试级别”。如果调试级别为0,则不提供额外的输出。当大于1时,就会给出调试输出,并以更大的数字表示更详细的内容。

我还想设置它,以便过程能够运行,并且假设级别为0,如果我还没有开始定义它的话。比如:( defined?是我不知道该怎么做的魔法?)

代码语言:javascript
复制
(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,比如:

代码语言:javascript
复制
(guard (x (else #f)) (eval 'debug-level))

由于引用了'debug-level,所以可以对其进行计算并将其传递给eval。然后,当eval试图计算它时,会发生一个错误,我希望guard能捕捉到这个错误。事实并非如此。

编辑2我意识到我想将调试跟踪封装到一个单独的过程中,并且定义该过程的文件也可以定义默认为0的debug-level。使用分离过程的原因是为了降低过程中工作的行数,并允许在需要时重定向调试输出。

EN

回答 2

Stack Overflow用户

发布于 2010-07-17 03:51:31

R5RS笨重但可行的解决方案。利用let语法经常被忽略/遗忘的能力来重新定义关键字。这很笨重,因为整个文件都是用let语法包装的,还因为它为每个定义增加了一些开销。我使用关联列表来记住定义,哈希表将是一个更好的选择。

代码语言:javascript
复制
(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))
  )

版画

代码语言:javascript
复制
#t
#f

下面在球拍:一个模块是用来重新定义定义,以存储每个符号和定义在一个列表,称为定义-列表。宏定义的?在此列表中查看是否定义了天气符号。

代码语言:javascript
复制
(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

票数 3
EN

Stack Overflow用户

发布于 2010-07-16 19:03:50

要备份一点,defined?函数的问题是如果您编写

代码语言:javascript
复制
(defined? debug-level)

方案将尝试计算debug-level,这当然是一个错误,因为它没有定义。这种形式必须由编译器/解释器作为特例在内部实现。

这样一个特殊的表单不是R5RS标准的一部分(除非我错过了它,请复核)。因此,对于R5RS方案,除非您找到一个将其作为非标准扩展来实现的方案,否则您将不走运。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3267351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档