gpt4 book ai didi

macros - Racket - 宏中的变量有问题

转载 作者:行者123 更新时间:2023-12-01 02:16:07 25 4
gpt4 key购买 nike

我目前正在尝试为宏分配一个变量来存储一些东西:

(begin-for-syntax
(define a 0))
(define-syntax (foo stx)
(set! a (+ a 1))
(datum->syntax stx a))
(foo)
(foo)
(foo)

编译这段代码后,repl 显示“1 2 3”。但是,当我在 repl 中输入“(foo)”时,下一个数字是“1”而不是我预期的“4”。
1
2
3
> (foo)
1

看起来变量“a”在编译完成后被重置。当我在另一个模块中“要求”这段代码时,同样的事情发生了。

有可能解决这个问题吗?

最佳答案

我无法真正解释为什么它不起作用,但我觉得在阶段 1 中“隐藏”一个变量可能并不完全是正确的方法。您几乎可以使用模块和没有宏来实现相同的效果:

(module adder racket/base
(provide foo)
(define a 0)
(define (foo)
(set! a (add1 a))
a))

(require 'adder)
(foo)
(foo)
(foo)

打印
1
2
3

但随后序列在 REPL 级别继续:
> (foo)
4
> (foo)
5

当然你也可以使用简单的闭包:
(define foo
(let ((a 1))
(lambda ()
(begin0
a
(set! a (add1 a))))))

关于macros - Racket - 宏中的变量有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24863707/

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