Scheme Let语言中的合同

Scheme Let语言中的合同,scheme,lisp,racket,let,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 sy

我看到一个问题,问的是关于一种叫做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)))))
所以在这里,这个方法需要一个符号,一个值和一个环境,我认为它产生了一个新的环境。
这是否意味着此方法的契约是标识符(变量)、值、环境=环境?

您的函数开始时是这样的:

(lambda (syms vals old-env) ...)
这里
sym
代表符号,因此
syms
代表
符号列表
aka
符号列表
。同样地,
vals
代表
值列表
。最后,
old env
是一个环境

这包括函数的输入。要确认
syms
应该是符号列表,请查看
syms
在主体中的使用方式。我们看到你使用:
(空?符号)
(汽车符号)
,和,
(cdr符号)
。这意味着我们猜对了

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

综上所述:从Racket来看,合同是:

extend-env* : list-of-symbols list-of-values environment -> environment
现在,在您的程序中,符号表示标识符,因此您还可以编写:

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

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

事实上,这就是我的理解。你与该方法的约定是,你承诺给它一些特定类型的参数,并且它会返回特定类型的结果。这似乎是正确的。我知道符号也是列表,但我不知道我们应该在合同中写符号列表还是仅仅写符号,因为它表示特定类型。符号不是列表。符号列表就是一个列表。合同是对输入和输出类型的描述。作为评论中的合同,上述描述是可以接受的。如果您需要特定环境中的合同,您需要详细说明您需要这些合同的地方。