这个方案是什么做的?

时间:2012-03-27 01:30:37

标签: scheme

#lang eopl

(define-datatype env env?
  (empty-env)
  (extended-env (var symbol?)
                (val scheme-val?)
                (envi env?)))

(define (scheme-val? x) #t)

; examples
(define e-env (empty-env))
(define e1 (extended-env 'x 1 (extended-env 'y #f e-env)))

我不知道如何使用scheme-val?。为什么会有x,为什么我们会返回#t? 环境是将变量与值相关联的函数。

因此,在示例中,我们正在关联x = 1y = #f,对吗?

感谢。

2 个答案:

答案 0 :(得分:3)

scheme-val?是一个函数,如果传递给它的值是该类型(在本例中是“scheme-val”),它应该返回#t(true)。就像symbol?对于符号返回true而对其他所有内容返回false,scheme-val?将对任何作为scheme-val的对象返回true。

事实证明,在这种情况下,scheme-val?对所有内容都返回true - 因此一切都是scheme-val。 x存在,因为谓词需要一个参数,它只是忽略参数并返回#t

在这种情况下这很重要,因为你会注意到define-datatype,它需要一个值,一个谓词来检查它的类型(env是值,env?是谓词)。

显然extended-env也有类似的条款。在这种情况下,其中三个:varsymbol?valscheme-val?env,{{1} }}

答案 1 :(得分:1)

在方案中,#t表示布尔值为true,#f表示为false。我不完全理解其余的,但我建议DrRacket的调试器看看发生了什么。

(define e-env (empty-env))

e-env指定为empty-env

(define (scheme-val? x) #t)

定义了一个带有参数x的匿名函数,如果它是scheme-val(在这种情况下是任何东西),则返回#t

此代码运行后e1的结果是:

#(struct:extended-env x 1 #(struct:extended-env y #f #(struct:empty-env)))

所以e1extended-env with var='x, val=1, envi=(extended-env with var='y, val=#f, envi=e-env)

(我认为)