Scheme 定义调用嵌套函数的函数

Scheme 定义调用嵌套函数的函数,scheme,mit-scheme,Scheme,Mit Scheme,我一直在学习在线方案教程,对以下代码感到困惑: (define make-bank-account (lambda (balance) (display "Ding") (lambda (n) (display "Dong") (set! balance (+ balance n)) balance))) (define account1 (make-bank-account 10)) ;; My code (define accoun

我一直在学习在线方案教程,对以下代码感到困惑:

(define make-bank-account
  (lambda (balance)
    (display "Ding")
    (lambda (n)
      (display "Dong")
      (set! balance (+ balance n))
      balance)))

(define account1 (make-bank-account 10))

;; My code
(define account2
  (lambda (x)
    ((make-bank-account 10) x)))
为什么account2不在不同的调用之间累加余额,而account1累加余额?例如:

(account1 5)
-> Dong
;Value: 15

(account1 10)
-> Dong
;Value: 25

(account2 5)
-> DingDong
;Value: 15

(account2 10)
-> DingDong
;Value: 20

我已经使用“叮”和“咚”测试了代码,注意到当调用account1时,不会显示“叮”,而调用account2时,会同时显示“叮”和“咚”。我相信这正是问题所在。提前谢谢

在代码中,您每次调用它时都在创建一个新的函数,因为您返回的函数包括对
创建银行帐户
的新调用。如果将其稍微更改为:

(define account2
    (lambda (x)
        (account1 x)))
显然,你会得到正确的功能<但是,code>account1调用
make bank account
并使用返回的函数,该函数在您重复调用占位符时“保存”具有正确值的占位符

要显示差异,您可以“记住”您创建的帐户。这与原始代码基本相同:

(define new-account
  (lambda (initial-amount)
    (define my-account (make-bank-account initial-amount))
    (lambda (amount)
      (my-account amount))))
请注意,您返回的函数(第二个lambda)已经初始化了
my account
,只需调用一次
make bank account
。然后,要创建新帐户,请执行以下操作:

> (define account3 (new-account 20))
Ding
> (account3 30)
Dong50
> (account3 30)
Dong80
> 

在代码中,您每次调用它时都在创建一个新的函数,因为您返回的函数包括对
创建银行帐户
的新调用。如果将其稍微更改为:

(define account2
    (lambda (x)
        (account1 x)))
显然,你会得到正确的功能<但是,code>account1调用
make bank account
并使用返回的函数,该函数在您重复调用占位符时“保存”具有正确值的占位符

要显示差异,您可以“记住”您创建的帐户。这与原始代码基本相同:

(define new-account
  (lambda (initial-amount)
    (define my-account (make-bank-account initial-amount))
    (lambda (amount)
      (my-account amount))))
请注意,您返回的函数(第二个lambda)已经初始化了
my account
,只需调用一次
make bank account
。然后,要创建新帐户,请执行以下操作:

> (define account3 (new-account 20))
Ding
> (account3 30)
Dong50
> (account3 30)
Dong80
> 

由于没有可累积的账户,因此金额不会累积

从定义上看,

(define account2
  (lambda (x)
    ((make-bank-account 10) x)))
account2
是一个

  • 取一个金额
    x
  • 创建一个余额为10的新帐户
  • 将给定金额
    x
    存入新创建的帐户
它创建的帐户从未存储在任何地方,因此不会再发生任何其他情况


也就是说,每次你说
(account2 5)
——这相当于
((创建银行账户10)5)
——就会创建一个新账户(丁),并将5个单位存入该账户(侗)。

由于没有可累积的账户,因此金额不会累积

从定义上看,

(define account2
  (lambda (x)
    ((make-bank-account 10) x)))
account2
是一个

  • 取一个金额
    x
  • 创建一个余额为10的新帐户
  • 将给定金额
    x
    存入新创建的帐户
它创建的帐户从未存储在任何地方,因此不会再发生任何其他情况

也就是说,每次你说
(account2 5)
——这相当于
((创建银行账户10)5)
——就会创建一个新账户(叮),并将5个单位存入该账户(叮)