lambda - SICP - Lambda 输出

标签 lambda scheme lisp racket sicp

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

外层是接受参数 abcx 的过程,过程返回另一个过程,该过程也采用参数 abcx 有效地隐藏原始绑定(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/

相关文章:

javascript - React.useCallback() 用于链式匿名函数

scheme - 使用 call/cc 进行循环。让我们开始吧

macros - 添加 f-exprs 是否简化了 LISP 中基本表达式宏的实现?

clojure - 使用 Clojure 编写蒙特卡洛模拟程序

lisp - 与常见的 lisp 库作斗争

C++11:std::bind 因 lambda 而崩溃

c# - 检索在 Func 中执行的调用方法的名称

c++ - 查询 lambda/函数的参数数量

macros - 在 Scheme 中捕获宏

scheme - 如何将方案中的列表拆分为 n 个大小均匀的 block ?