Let语言中的契约

时间:2015-11-12 09:56:00

标签: scheme lisp racket let

我看到一个问题,询问有关被称为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)))))

所以在这里,方法将符号作为值和环境,我认为它会产生一个新的环境。 这是否意味着此方法的合同是标识符(变量),值,环境=环境?

1 个答案:

答案 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

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