使用词法闭包的球拍

The*_*rza 2 lambda lexical-closures racket

我在Let over Lambda中阅读了有关词汇clojures的内容,并且此代码示例适用于Common Lisp:

(let ((counter 0))
  (lambda () (incf counter)))
Run Code Online (Sandbox Code Playgroud)

我试着在Racket中写成这样:

(let ((counter 0))
  (lambda() (+ counter 1)))
Run Code Online (Sandbox Code Playgroud)

当我在REPL中调用它时,counter它给了我错误:

counter: undefined;
 cannot reference an identifier before its definition
Run Code Online (Sandbox Code Playgroud)

据我了解,将let / set与lambda混合使用可以在lambda中存储某些状态,该状态可以由其他功能处理,其方式与人类记忆可以通过感官的输入进行处理和更改一样。我对我的LISP程序中的部分代码感兴趣,这些代码部分因与其他功能的交互而更改。即使lambda不能做到这一点,我仍然想了解它(lambda函数),因为它似乎是Racket和其他LISP方言的重要组成部分。

Ren*_*nzo 5

(incf x)在Common Lisp中,它与(+ x 1)在Racket中并不等效,而是先递增x(set! x (+ x 1)),然后返回新值的组合。

因此,如果您想在Racket中定义类似的函数,可以编写以下代码,例如:

(define count
  (let ((counter 0))
    (lambda () (begin (set! counter (+ counter 1)) counter))))

(count)    ; returns 1

(count)    ; returns 2
Run Code Online (Sandbox Code Playgroud)