【问题标题】:Contracts in Let languageLet语言中的合同
【发布时间】:2016-02-13 14:41:32
【问题描述】:

我看到一个问题,它询问了一种称为 let 的宠物语言中的方法的合同。语言并不重要,但合同是否意味着 该方法作为参数的东西及其评估后的值?

(define extend-env*
  (lambda (syms vals old-env)
    (if (null? syms)
      old-env
      (extended-env-record 
        (car syms) 
        (car vals)
        (extend-env* (cdr syms)
                     (cdr vals) 
                     old-env)))))

因此,这里的方法采用符号、值和环境,我认为它会产生一个新环境。 这是否意味着此方法的合同是 Identifier(Variable),Value,Environment = Environment ?

【问题讨论】:

  • 确实,这就是我所理解的。您与该方法的约定是您承诺向其提供某种类型的参数,并且它会返回某种类型的结果。

标签: scheme lisp racket let


【解决方案1】:

你的函数是这样开始的:

(lambda (syms vals old-env) ...)

这里sym 代表符号,因此syms 代表a list of syms 又名a list of symbols。以同样的方式vals 代表a list of values。最后old-env 是一个环境。

这涵盖了函数的输入。要确认 syms 应该是符号列表,请查看 syms 在正文中的使用方式。我们看到你使用:(null? syms)(car syms)(cdr syms)。这意味着我们猜对了。

要查看输出的类型,请查找产生返回值的表达式。 最简单的是old-env,它是一个环境。如果函数总是返回相同类型的值,我们已经确定输出是一个环境。不过最好检查一下其他返回表达式是否也返回环境。

总结一下:从Racket看到的合约是:

extend-env* : list-of-symbols list-of-values environment -> environment

现在在你的程序中,符号代表标识符,所以你也可以这样写:

extend-env* : list-of-identifiers list-of-values environment -> environment

如果您记录标识符以符号表示。

【讨论】:

  • 这似乎是正确的。我知道符号也是列表,但我不知道我们是否应该在合约中写符号列表或只是符号,因为它表示某种类型。
  • 符号不是列表。一个符号列表就是一个列表。契约是对输入和输出类型的描述。作为评论中的合同,上述描述很好。如果您需要特定上下文中的合同,则需要详细说明您需要它们的位置。
猜你喜欢
  • 2018-08-30
  • 1970-01-01
  • 2017-02-05
  • 2014-07-23
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多