我看到一个问题,这个问题是关于一个方法的契约,在一种被称为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 syms
akaa 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
如果您将标识符记录为符号。