如何检查Scheme中是否存在变量?

时间:2010-10-02 04:06:40

标签: lisp scheme

有没有办法检查Scheme中是否存在变量?即使做(如果是变量)或(null?variable)这样的事情也会导致错误,因为没有定义变量。是否有一些函数可以返回变量是否存在?

4 个答案:

答案 0 :(得分:3)

这是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)

答案 1 :(得分:3)

您想向环境提问。这对于R5RS是不可能的,我不确定R6RS。我当然希望仅使用Scheme标准(并且可能成为R7RS的一部分 - 在list of items they are likely going to work on中查找“环境查询”)。

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

Chicken支持使用oblist egg(它可以让你获得所有实习符号的列表),以及environments egg,它可以让你具体询问是否绑定了一个符号。< / p>

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

答案 2 :(得分:3)

此功能内置于Mit-Scheme中。

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

答案 3 :(得分:2)

根据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