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

时间:2018-09-29 12:54:26

标签: rebol red

是否有替代语法:

a: [
b: [
    1 2
]
]

append (do "a/b") 3   

== [
    b: [
        1 2
    ]
] 

我觉得使用do并不是很优雅(它在javascript中评估过多)。

我尝试不成功。

6 个答案:

答案 0 :(得分:3)

最简单的方法是使用路径符号直接“寻址”内部块:

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

答案 1 :(得分:2)

重新注释您要在变量中使用a / b:

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

答案 2 :(得分:1)

给出您的初始任务

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是可分配的对内部块的取消引用。

ETA:

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

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

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

答案 3 :(得分:1)

  

为什么这不起作用:a:[b:[1 2 3]] var:路径“ a / b”追加var 4

这样做(注意GET)

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

答案 4 :(得分:1)

由于路径符号只是 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
== [1 2]
>> append b 3
== [1 2 3]

答案 5 :(得分:0)

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

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