gpt4 book ai didi

variables - Racket:获取名称存储在另一个变量中的变量的值

转载 作者:行者123 更新时间:2023-12-02 23:17:38 25 4
gpt4 key购买 nike

我有一个变量“name”,它的值是另一个变量的名称。例如:

(define name 'a)
(define a 1)

然后我想做这样的事情:

(set! ,name 10)

但这会产生错误,因此我希望将“,name”替换为它的值(即“a”)。因此,上面的代码将变量“a”的值设置为10,并且“name”变量保持不变。

我知道我可以这样做:

(eval `(set! ,name 10))

但这仅在“name”中包含的变量是全局变量时才有效,而我的程序中并非如此。

目前我通过引入一个新的命名空间解决了这个问题,但这使得代码有点难看,这就是为什么我会避免使用 eval (因此也避免引入一个新的命名空间)。

如果我在 C++ 中没有弄错的话,这将通过取消引用句柄(指向指针的指针)来完成。

最佳答案

(eval `(set! ,name 10)) 不起作用的原因是局部变量的名称在运行时不存在。局部变量存储在堆栈中,因此对局部变量的引用和赋值被编译为“获取第 i 个变量中的值(从堆栈顶部算起)”并“将此值存储在第 i 个槽中堆栈”。

但是,模块级变量存储在命名空间中,因此您可以对它们使用eval 解决方案。

那么如何处理局部变量呢?最好使用哈希表,但如果您确实需要它,请执行以下操作:

(define (set-local-variable name val)
(match name
['a (set! a val)]
['b (set! b val)]
...))

其中 a、b、... 是局部变量。当然,您需要将定义放在相关局部变量的范围内。这也意味着您需要为每个范围定义一个set-local-variable

这很快就会变得难以维护,因此寻找替代解决方案 - 例如基于哈希表的解决方案。

关于variables - Racket:获取名称存储在另一个变量中的变量的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29681628/

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