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

时间:2017-10-27 18:45:42

标签: rebol red

使用像

这样的设置,可以很容易地在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是否可行?

2 个答案:

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

查看