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