gpt4 book ai didi

lambda - 使用词法闭包的 Racket

转载 作者:行者123 更新时间:2023-12-02 00:57:14 24 4
gpt4 key购买 nike

我在 Let over Lambda 中读到了有关词法 clojures 的内容,并且为 Common Lisp 提供了此代码示例:

(let ((counter 0))
(lambda () (incf counter)))

我尝试在 Racket 中将其写为:

(let ((counter 0))
(lambda() (+ counter 1)))

当我在 REPL 中将其称为 counter 时,它给出了错误:

counter: undefined;
cannot reference an identifier before its definition

据我所知,将 let/set 与 lambda 混合使您能够在 lambda 中存储一些状态,这些状态可以由其他函数处理,就像人类内存可以通过来自 lambda 的输入进行处理和更改一样。感官。我感兴趣的是在我的 LISP 程序中包含一些通过与其他函数交互而改变的代码。即使这不是由 lambda 完成的,我仍然想理解它(lambda 函数),因为它似乎是 Racket 和其他 LISP 方言的重要组成部分。

最佳答案

Common Lisp 中的

(incf x) 并不等同于 Racket 中的 (+ x 1),而是先递增 x 的组合>: (set!x (+ x 1)),然后返回新值。

所以,如果你想在 Racket 中定义类似的函数,你可以这样写,例如:

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

(count) ; returns 1

(count) ; returns 2

关于lambda - 使用词法闭包的 Racket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36504025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com