Красный: любая альтернатива использованию do для добавления динамических ключей в блок - PullRequest
0 голосов
/ 29 сентября 2018

Есть ли альтернативный синтаксис для:

a: [
b: [
    1 2
]
]

append (do "a/b") 3   

== [
    b: [
        1 2
    ]
] 

Я не чувствую, что это очень элегантно, используя do (в javascript он слишком похож на eval).

Я пыталсяпуть без успеха.

Ответы [ 6 ]

0 голосов
/ 04 октября 2018

Поскольку обозначение пути является просто ярлыком для , выберите , вы можете обойти путь, используя 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 сделает это, и вы можете использовать

>> do a
== [1 2]
>> append b 3
== [1 2 3]
0 голосов
/ 01 октября 2018

Самый простой способ - использовать обозначение пути для непосредственного "адресации" внутреннего блока:

>> a: [ b: [ 1 2 ] ]
== [b: [1 2]]
>> append a/b 3
== [1 2 3]
0 голосов
/ 01 октября 2018

Почему это не работает, хотя: a: [b: [1 2 3]] var: to-path "a / b" append var 4

Это работает (обратите внимание, ПОЛУЧИТЬ)

a: [b: [1 2 3]]
var: load "a/b"
append get var 4
probe a
== [b: [1 2 3 4]]
0 голосов
/ 30 сентября 2018

Повторно прокомментируйте, что вы хотите a / b в переменной:

a: [b: [1 2 3]]
var: a/b
append var 4
probe a
== [b: [1 2 3 4]]
0 голосов
/ 29 сентября 2018

Учитывая ваше начальное назначение

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]]

На языке стиля Алгол это будет что-то вроде 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].)

0 голосов
/ 29 сентября 2018
a: [b: [ 1 2 3]] 
append a/b 4

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