使用像
这样的设置,可以很容易地在rebol / red中动态创建GLOBAL变量i: 1
myvarname: rejoin ["var" i]
set to-word myvarname 10
var1
但是var1是全局的。如果我想在函数内动态创建var1并使其成为LOCAL以避免与同名的某些全局变量冲突,该怎么办?
在javascript中有可能: How to declare a dynamic local variable in Javascript
不确定rebol / red是否可行?
答案 0 :(得分:2)
在Rebol中,有使用:
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
应该预先警告,它的工作方式是有效地创建像制作对象的创作! [x:无] 。然后它深入了解USE的身体,寻找任何字体!名为 x (或 X ,大小写无关紧要)...并将它们绑定到该对象!。
这有几个恼人的属性:
绑定的枚举和更新需要时间。如果您处于循环中,则每次访问都需要这段时间。
创建OBJECT!制作两个系列节点,一个用于跟踪键(x),另一个用于跟踪变量(20)。如果您处于循环中,则每次通过该循环都将创建两个系列节点。正如循环外的GET所示,这些节点将一直存在,直到垃圾收集器决定不再需要它们为止。
你可能想说使用[x]代码而不是破坏代码中的绑定,因此在更改之前需要对主体进行深度复制。
深度绑定的不良属性导致红色到FOR-EACH等构造的change the language semantics。它目前也没有USE构造,或许被认为是最好的,以避免一些相同的推理。
(注意:Rebol方面正在研究新的方法,以使性能“可接受的成本”,这可能足以在将来使用。这将是{{{{{ 3}})
答案 1 :(得分:2)
在Red中你有功能,在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