是否可以在rebol/red中动态创建LOCAL变量



使用类似的集合可以很容易地在rebol/red中动态创建GLOBAL变量

i: 1
myvarname: rejoin ["var" i]
set to-word myvarname 10
var1

但是var1是全局的。如果我想在函数内部动态创建var1并使其为LOCAL,以避免与一些同名的全局变量发生冲突,该怎么办?

在javascript中,可以:如何在Javascript 中声明动态局部变量

不确定是否有可能在篮板/红色?

在红色中有函数,在Rebol2中有函数。两者都会自动创建局部变量词。这里是Rebol2 的一个例子

>> for num 1 100 1 [ 
[      set to-word rejoin ["f" num] funct [] compose/deep [
[            print [ "n =" n:  (num) ]
[          ]
[    ]
>> f1
n = 1
>> f2
n = 2
>> n
** Script Error: n has no value
** Near: n

它是如何做到的,你可以用source funct看到

在Rebol中,有USE:

x: 10
word: use [x] [
x: 20
print ["Inside the use, x is" x]
'x ;-- leak the word with binding to the USE as evaluative result
]
print ["Outside the use, plain x is" x]
print ["The leaked x from the use is" get word]

这将给你:

Inside the use, x is 20
Outside the use, x is 10
The leaked x from the use is 20

应该预先警告一下,它的工作方式是有效地创建make对象![x:none]。然后它对USE的身体进行了一次深入的行走,寻找ANY-WORD!命名为x(或x,大小写无关紧要)。。。并将它们绑定到OBJECT!。

这有几个令人讨厌的属性:

  • 绑定的枚举和更新需要时间。如果你处于一个循环中,那么每次访问都需要这个时间。

  • OBJECT的创建!生成两个系列节点,一个用于跟踪密钥(x),另一个用于追踪vars(20)。同样,如果您处于循环中,则每次通过该循环都会创建两个系列节点。正如循环外的GET所示,这些节点将一直逗留,直到垃圾收集器决定不再需要它们为止。

  • 您可能想说使用[x]code而不破坏代码中的绑定,因此在更改正文之前需要对其进行深度复制。

深度绑定的不良特性导致Red改变了FOR-EACH等结构的语言语义。它目前也没有USE结构,出于同样的原因,可能被认为是最好避免的。

(注意:Rebol方面正在研究新的方法,以使性能"可接受的成本",这可能足以在未来使用。这将是用于特定绑定的技术的演变)