Почему в Rebol2 не действует динамическое добавление кода к объекту?

StackOverflow https://stackoverflow.com//questions/22054644

Вопрос

Этот вопрос касается динамического добавления кода в контексты или объекты в 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.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top