我看到一个问题,询问有关被称为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)))))
所以在这里,方法将符号作为值和环境,我认为它会产生一个新的环境。 这是否意味着此方法的合同是标识符(变量),值,环境=环境?
答案 0 :(得分: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
如果您记录标识符表示为符号。