SICP - Lambda 输出

SICP - Lambda output

我使用 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。

为什么会这样?为什么解释器 return 是过程而不是操作的结果?

(define (proc-name args ...) body ...)

创建一个过程并将其绑定到变量 proc-name。是

的缩写
(define proc-name 
  (lambda (args ...)
    body ...))

在这种情况下,define 将一个变量绑定到一个值,而该值恰好是一个过程。如果你想拼出你的 random 它变成:

(define random 
  (lambda (a b c x)
    (lambda (a b c x)
      (+ (* a (* x x)) (* b x) c))))

外部是采用参数 abcx 的过程,而过程 return 也是另一个过程采用参数 abcx 有效地隐藏原始绑定,然后对这些绑定进行一些表达式。一个示例用法是

((random #f #f #f #f) 4 2 9 3)

因为很明显你的程序不是 return 你应该使用顶部的缩写形式的程序:

(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)))

通常有过程 return 过程以及传递过程作为过程中使用的参数。 Scheme 不知道一个变量绑定是否是一个过程,然后才应该用括号调用它,这样如果你尝试像 ((+ a b) 4)[=28= 这样的新手错误,比如额外的括号会给出奇怪的错误 "application: (+ a b) not a procedure" ]

其中 return 是一个过程的示例可以是部分应用程序:

; 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