我使用 Racket 和 IDE Dr. Racket 内部定义了以下过程:
(define (random a b c x)
(lambda (a b c x)
(+ (* a (* x x))
(* b x)
c)))
如您所见,其中有一个 lambda 表达式。我试过打电话:
(random 4 2 9 3)
我得到了一个输出:
#<procedure:...ercício-2.4.rkt:16:2>
我以为我会得到51。
为什么会这样?为什么解释器返回的是过程而不是操作的结果?
最佳答案
(define (proc-name args ...) body ...)
创建一个过程并将其绑定(bind)到变量 proc-name。是
的缩写(define proc-name
(lambda (args ...)
body ...))
在这种情况下,define
将一个变量绑定(bind)到一个值,而该值恰好是一个过程。如果你想拼出你的 random
它变成:
(define random
(lambda (a b c x)
(lambda (a b c x)
(+ (* a (* x x)) (* b x) c))))
外层是接受参数 a
、b
、c
和 x
的过程,过程返回另一个过程,该过程也采用参数 a
、b
、c
和 x
有效地隐藏原始绑定(bind)然后执行对那些的一些表达。一个示例用法是
((random #f #f #f #f) 4 2 9 3)
由于很明显您的过程不应该返回一个过程,您应该使用顶部的简短形式:
(define (random a b c x)
(+ (* a (* x x)) (* b x) c))
或等效的非糖形式:
(define random
(lambda (a b c x)
(+ (* a (* x x)) (* b x) c)))
过程返回过程以及传递过程作为过程中使用的参数是很常见的。 Scheme 不知道一个变量绑定(bind)是否是一个过程,然后它应该用括号调用它,这样如果你尝试像 ((+ a b) 4)
返回是过程的示例可以是部分应用:
; makes a procedure that adds initial
(define (make-add initial)
(lambda (v) (+ initial v))
(define add-10 (make-add 10))
(define add-3 (make-add 3))
(add-3 2) ; ==> 5
(add-10 2) ; ==> 12
关于lambda - SICP - Lambda 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39521447/