Почему в Rebol2 не действует динамическое добавление кода к объекту?
Вопрос
Этот вопрос касается динамического добавления кода в контексты или объекты в rebol 2, это связано с вопросом Динамическое добавление слов в контекст в REBOL но это не тот же самый вид.
Если я хочу динамически добавлять код к объектам rebol, используя его блок кода, у меня возникли проблемы из-за странного поведения:
>> append third o [c: 3]
== [a: 1 b: 2 c: 3]
но...
>> first o
== [self a b]
>> second o
== [make object! [
a: 1
b: 2
] 1 2]
>> third o
== [a: 1 b: 2]
приложение отсутствует!то же самое, если добавить к first o
или second o
этого не происходит при использовании «общих» блоков:
>> m: [a [b] c]
== [a [b] c]
>> append m 3
== [a [b] c 3]
>> m
== [a [b] c 3]
>> append second m 1
== [b 1]
>> m
== [a [b 1] c 3]
почему это?
Решение
А third
Функция не возвращает исходную спецификацию объекта, она возвращает новый блок наборов слов и значений, сгенерированных из слов и значений объекта.Итак, вы добавляете к этому новому блоку (что влияет на блок, но не на объект).
Вы не можете получить ссылку на серию исходного блока, переданную в качестве спецификации объекта.Он выбрасывается после создания объекта и в любом случае не оказывает дальнейшего влияния на объект.Так даже если вы сохранили ссылку на блок, в который передали make object
, добавление к нему также ничего не сделает с объектом.
Вы просто не можете добавлять объекты к объектам в Rebol 2.Но в Rebol 3 к объектам можно добавлять:
>> append make object! [a: 1 b: 2] [c: 3]
== make object! [
a: 1
b: 2
c: 3
]
(Примечание:Не используйте порядковые отражатели в Rebol 2.Использовать words-of
вместо first
, values-of
вместо second
, и body-of
вместо third
.Порядковые отражатели устарели с версии Rebol 2.7.7, вышедшей 5 лет назад, и были удалены в Rebol 3.)