首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SICP - Lambda输出

SICP - Lambda输出
EN

Stack Overflow用户
提问于 2016-09-16 06:47:32
回答 1查看 245关注 0票数 0

我使用Racket和在IDE Dr. Racket中定义了以下过程:

代码语言:javascript
复制
(define (random a b c x)
  (lambda (a b c x)
    (+ (* a (* x x))
       (* b x)
       c)))

正如您可能看到的,它内部有一个lambda表达式。我试着打电话:

代码语言:javascript
复制
(random 4 2 9 3)

我得到了一个输出:

代码语言:javascript
复制
#<procedure:...ercício-2.4.rkt:16:2>

我以为我会得51分。

这一切为什么要发生?为什么解释器返回的是过程而不是操作的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-16 07:17:16

代码语言:javascript
复制
(define (proc-name args ...) body ...)

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

代码语言:javascript
复制
(define proc-name 
  (lambda (args ...)
    body ...))

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

代码语言:javascript
复制
(define random 
  (lambda (a b c x)
    (lambda (a b c x)
      (+ (* a (* x x)) (* b x) c))))

外部是接受参数abcx的过程,该过程返回另一个过程,该过程也接受参数abcx,有效地隐藏了原始绑定,然后对这些绑定执行一些表达式。一个用法示例如下

代码语言:javascript
复制
((random #f #f #f #f) 4 2 9 3)

由于您的过程显然不应该返回过程,因此您应该在顶部使用简短的形式:

代码语言:javascript
复制
(define (random a b c x)    
  (+ (* a (* x x)) (* b x) c))

或等效的无糖形式:

代码语言:javascript
复制
(define random 
  (lambda (a b c x)    
    (+ (* a (* x x)) (* b x) c)))

让过程返回过程以及传递过程作为过程中使用的参数是很常见的。在使用括号调用变量绑定之前,Scheme不知道它是否是一个过程,因此,如果您尝试像((+ a b) 4)这样的东西,新手错误(如额外的圆括号)会产生奇怪的错误"application:(+ a b) not a procedure

例如,return是一个过程,可以是部分应用程序:

代码语言:javascript
复制
; 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39521447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档