红色:使用 do 将动态键添加到块的任何替代方法

Red: any alternative to using do for adding dynamic keys to a block

是否有替代语法:

a: [
b: [
    1 2
]
]

append (do "a/b") 3   

== [
    b: [
        1 2
    ]
] 

我觉得使用 do 不是很优雅(它与 javascript 中太多的 eval 相似)。

我尝试了路径但没有成功。

a: [b: [ 1 2 3]] 
append a/b 4

probe a
== [b: [1 2 3 4]]

鉴于您的初始分配

a: [b: [1 2]] == [b: [1 2]]

您想将 3 附加到内部块。您可以通过

获取内部块

do "a/b" == [1 2]

但您也可以通过

获取

probe a/b == [1 2]

这让您可以像这样追加:

append a/b 3 == [1 2 3] probe a == [b: [1 2 3]]

在 Algol 风格的语言中,这类似于 a.b = append(a.b, 3)a/b 是对内部块的可分配取消引用。

预计到达时间:

如果您想关闭取消引用,do "a/b" 的替代方法可能是创建一个函数:

ab: function [][a/b] == func [][a/b] append ab 7 == [1 2 7]

(或者,ab: does [a/b]。)

重新评论你想要a/b在一个变量中:

a: [b: [1 2 3]]
var: a/b
append var 4
probe a
== [b: [1 2 3 4]]

Why this doesn't work though: a: [b: [1 2 3]] var: to-path "a/b" append var 4

这样做(注意 GET)

a: [b: [1 2 3]]
var: load "a/b"
append get var 4
probe a
== [b: [1 2 3 4]]

最简单的方法是直接对"address"内部块使用路径表示法:

>> a: [ b: [ 1 2 ] ]
== [b: [1 2]]
>> append a/b 3
== [1 2 3]

由于路径符号只是 select 的快捷方式,您可以使用 select

绕过路径

红色

>> a: [ b: [ 1 2 ] ]
== [b: [1 2]]
>> append select a 'b 3
== [1 2 3]
>> a
== [b: [1 2 3]]

在 Rebol 中你必须做

>> append select a to-set-word 'b 3
== [1 2 3]

顺便问一下,为什么不使用 a: [ b [ 1 2 ] ] 还是要将内部块分配给全局变量 b ?然后一个简单的 do a 就可以做到,你可以使用

>> do a
== [1 2]
>> append b 3
== [1 2 3]