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

时间:2015-04-16 17:11:46

标签: variables namespaces racket

我有一个变量" name"其值是另一个变量的名称。 例如:

(define name 'a)
(define a 1)

我想做这样的事情:

(set! ,name 10)

但是这会引起错误,所以我想要#34;,名字"取而代之的是它的价值(即' a)。这样上面的代码就设置了变量" a"的值。到10,"名称"变量保持不变。

我知道我可以这样做:

(eval `(set! ,name 10))

但这仅适用于" name"中包含的变量。是一个全局变量,在我的程序中并非如此。

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

如果我没有在C ++中误解我,可以通过解除引用句柄(指向指针的指针)来完成。

1 个答案:

答案 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

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