我看到一个问题,这个问题是关于一个方法的契约,在一种被称为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?

最佳答案

您的函数如下所示:

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

这里sym代表符号,因此syms代表a list of symsakaa 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

如果您将标识符记录为符号。

10-06 05:52