【问题标题】:How can I check if a variable exists in Scheme?如何检查 Scheme 中是否存在变量?
【发布时间】:2010-10-02 04:06:39
【问题描述】:

有没有办法检查Scheme中是否存在变量?即使执行 (if variable) 或 (null? variable) 之类的操作也会导致错误,因为未定义变量。是否有一些函数可以返回变量是否存在?

【问题讨论】:

  • 你为什么需要这个?
  • @Paul:这并不能回答问题。
  • 这就是为什么我将其发布为评论而不是答案。
  • 我不是方案专家(或新手。:o) - 但您能否将错误作为条件捕获并根据该条件返回?
  • @Paul Nathan:不在标准 R5RS 中——我不确定 R6RS,但我相信在 R7RS 中它是可能的,因为他们正在标准化一些异常处理机制(但随后,它们也可能使环境查询标准化)。

标签: lisp scheme


【解决方案1】:

此功能内置于 Mit-Scheme 中。

#lang scheme   
(define x "hello world")
(environment-bound? (nearest-repl/environment) 'x)
(environment-bound? (nearest-repl/environment) 'not-x)

【讨论】:

    【解决方案2】:

    以下是 Racket 中的示例:

    #lang racket
    (define x 1)
    (define-namespace-anchor ns)
    (define (is-bound? nm)
      (define r (gensym))
      (not (eq? r (namespace-variable-value nm #t
                                                (lambda () r) 
                                                (namespace-anchor->namespace ns)))))
    
    (is-bound? 'x)
    (is-bound? 'not-bound-here)
    

    【讨论】:

      【解决方案3】:

      您想向环境提出问题。这对 R5RS 是不可能的,我不确定 R6RS。我当然想只使用 Scheme 标准来做到这一点(并且这个可能是 R7RS 的一部分——在list of items they are likely going to work on 中查找“环境查询”)。

      据我所知,目前只有 ad-hoc 解决方案,因此您必须阅读实施文档。

      Chicken 使用 oblist egg 支持这一点(它可以让您获得所有内部符号的列表),还使用 ​​environments egg 支持,它可以让您特别询问是否绑定了一个符号。

      根据您的实现,是否可以通过引用变量并捕获异常来测试它,然后检查它是否是未绑定异常或类似的东西。

      【讨论】:

        【解决方案4】:

        根据 R6RS,调用未绑定的变量是违反语法的。

        http://www.r6rs.org/final/html/r6rs/r6rs-Z-H-12.html#node_sec_9.1

        但是,根据您的实现,应该有一种方法(至少在理论上)可以查询环境并检查变量是否为成员。但是,您需要为此做一些进一步的阅读。

        http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-17.html#node_idx_1268

        【讨论】:

        • 但是,允许 R6RS 编译器实现拒绝编译有语法冲突的程序。我怀疑这也将成为 R7RS 的一部分。
        猜你喜欢
        • 2016-12-15
        • 2010-10-25
        • 2014-01-30
        • 2012-07-05
        • 2011-08-18
        • 2019-02-28
        • 2018-02-17
        • 1970-01-01
        相关资源
        最近更新 更多