【问题标题】:What does this scheme-val do?这个 scheme-val 有什么作用?
【发布时间】:2012-03-27 01:30:37
【问题描述】:
#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 关联起来,对吗?

谢谢。

【问题讨论】:

    标签: scheme


    【解决方案1】:

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

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

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

    显然extended-env 也采用类似的子句。在这种情况下,其中三个:var,这是一个symbol?val,这是一个scheme-val?env,这是一个env?

    【讨论】:

    • 非常好:) 谢谢。 returns true for everything 部分真的很有帮助。谢谢!
    【解决方案2】:

    在方案中,#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)

    (我认为)

    【讨论】:

    • 非常感谢。谓词scheme-valx,但在env 中,它是这样写的var scheme-val?,所以我猜当我们点击define-datatype 时,scheme 知道将谓词左侧的变量抛出为谓词的参数。对吗?
    • 不要将define-datatypedefine 混淆。在env 定义中,特别是extended-env 定义中,valscheme-val。这个scheme-val? 操作由(define (scheme-val? x) #t) 函数定义,它对任何参数x 都返回true。这只是语法。
    • 谢谢。但是当我们写 val scheme-val? 时,参数 x 在哪里呢? val 是否传递给 scheme-val?换句话说,scheme解释器很聪明地注意到,因为这是datatype,所以左边的变量作为参数传递?我希望这能解决我的问题。谢谢。
    猜你喜欢
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2016-07-30
    • 2017-07-25
    相关资源
    最近更新 更多