Есть несколько способов обойти тот факт, что в REBOL / 2 просто невозможно расширить контексты объекта.
Возможно, вы можете просто использовать BLOCK! S вместо OBJECT! S:
>> blobject: [foo 1]
== [foo 1]
>> blobject/bar
** Script Error: Invalid path value: bar
** Near: blobject/bar
>> append blobject [bar 2]
== [foo 1 bar 2]
>> blobject/bar: 3
== 3
Вы даже можете заставить себя работать, просто добавив сам объект:
>> insert blobject reduce ['self blobject]
== [[...] foo 1 bar 2]
>> same? blobject blobject/self
== true
Но так как вы просили продлить OBJECT! S , вы можете обратиться к решению Питера В. Вуда, чтобы просто клонировать объект. Просто имейте в виду, что при таком подходе результирующий клон действительно отличается от исходного объекта.
Итак, если какое-либо слово было установлено для хранения объекта до клонирования / расширения, после клонирования объекта это слово все равно будет содержать нерасширенный объект:
>> remember: object: make object! [foo: 1]
>> object: make object [bar: 2]
>> same? remember object
== false
>> probe remember
make object! [
foo: 1
]
Если вам важно сохранить «ссылки» на объект нетронутыми, вы можете обернуть объект, который нужно расширить, во внешний объект, как в
>> remember: object: make object! [access: make object! [foo: 1]]
>> object/access: make object/access [bar: 2]
>> same? remember object
== true
После этого вы можете сохранить объект, сохраняя его, только сохраняя ссылки на контейнер.
REBOL / 3, кстати, позволит добавлять слова в OBJECT! S.