我有一个变量" name"其值是另一个变量的名称。 例如:
(define name 'a)
(define a 1)
我想做这样的事情:
(set! ,name 10)
但是这会引起错误,所以我想要#34;,名字"取而代之的是它的价值(即' a)。这样上面的代码就设置了变量" a"的值。到10,"名称"变量保持不变。
我知道我可以这样做:
(eval `(set! ,name 10))
但这仅适用于" name"中包含的变量。是一个全局变量,在我的程序中并非如此。
目前我通过引入一个新的命名空间解决了这个问题,但这使得代码有点难看,这就是为什么我要避免使用eval(因此也避免引入新的命名空间)。
如果我没有在C ++中误解我,可以通过解除引用句柄(指向指针的指针)来完成。
答案 0 :(得分:3)
(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
。
这很快就会变得很难维护,所以寻找替代解决方案 - 例如基于哈希表的解决方案。