我使用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分。
这一切为什么要发生?为什么解释器返回的是过程而不是操作的结果?
发布于 2016-09-16 07:17:16
(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的过程,该过程返回另一个过程,该过程也接受参数a、b、c和x,有效地隐藏了原始绑定,然后对这些绑定执行一些表达式。一个用法示例如下
((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不知道它是否是一个过程,因此,如果您尝试像((+ a b) 4)这样的东西,新手错误(如额外的圆括号)会产生奇怪的错误"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) ; ==> 12https://stackoverflow.com/questions/39521447
复制相似问题