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方言的重要组成部分。
(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)
| 归档时间: |
|
| 查看次数: |
165 次 |
| 最近记录: |