【问题标题】:Is it possible to create LOCAL variable dynamically in rebol / red?是否可以在 rebol / red 中动态创建 LOCAL 变量?
【发布时间】:2017-10-27 18:45:41
【问题描述】:

在 rebol / red 中使用 set like 动态创建 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 是否可行?

【问题讨论】:

    标签: rebol red


    【解决方案1】:

    在 Red 中你有 function,在 Rebol2 中你有 funct。两者都自动创建局部变量词。这里是 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看看

    【讨论】:

      【解决方案2】:

      在 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
      

      应该预先警告,它的工作方式是有效地创建像 ma​​ke 对象! [x:无]。然后它对 USE 的主体进行了深入的遍历,寻找 ANY-WORD!被命名为 x(或 X,大​​小写无关)...并将它们绑定到该 OBJECT!。

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

      • 绑定的枚举和更新需要时间。如果您处于循环中,则每次访问都会花费此时间。

      • 对象的创建!制作两个系列节点,一个用于跟踪键 (x),一个用于跟踪 vars (20)。同样,如果您处于循环中,则每次通过该循环都会创建两个系列节点。正如循环外的 GET 所示,这些节点将一直存在,直到垃圾收集器确定不再需要它们为止。

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

        李>

      深度绑定的不良属性导致 Red 使用了 FOR-EACH 等构造的change the language semantics。它目前也没有 USE 构造,出于某些相同的原因,可能最好避免使用它。

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

      【讨论】:

      • 我知道 use 但我看不到如何在 use 块中动态添加变量(我在代码生成器的上下文中):也许这甚至不可能?
      • @user310291 你可能会发现 this answer 在这一点上具有指导意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2017-03-17
      • 2021-12-29
      • 2017-12-05
      • 1970-01-01
      相关资源
      最近更新 更多