#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 = 1
和y = #f
,对吗?
感谢。
答案 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
也有类似的条款。在这种情况下,其中三个:var
,symbol?
,val
,scheme-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)))
所以e1
是extended-env with var='x, val=1, envi=(extended-env with var='y, val=#f, envi=e-env)
(我认为)