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))))
外部是采用参数 a
、b
、c
和 x
的过程,而过程 return 也是另一个过程采用参数 a
、b
、c
和 x
有效地隐藏原始绑定,然后对这些绑定进行一些表达式。一个示例用法是
((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
我使用 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))))
外部是采用参数 a
、b
、c
和 x
的过程,而过程 return 也是另一个过程采用参数 a
、b
、c
和 x
有效地隐藏原始绑定,然后对这些绑定进行一些表达式。一个示例用法是
((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