Нет прицела !!!?
Причина, по которой «self / bar» не может знать, где найти «BAR», заключается в том, что в отсутствует область действия в Rebol (по крайней мере, в традиционном значении CS).
Слова в Реболе имеют значение только тогда, когда они статически связаны с контекстом. Это происходит автоматически, когда вы СДЕЛАЕТЕ объект, поэтому многие люди даже не осознают этого даже после нескольких лет использования.
Вот шаги (в общих чертах), когда объект (a.k.a. context) создан.
Он забирает все корневые слова набора в своей спецификации (в данном случае [FOO: BAR:])
Добавляет их к своим текущим внутренним словам (SELF: по умолчанию, больше, если вы используете объект в качестве основы)
Затем связывает все слова в блоке (иерархически) с теми множествами, которые он добавил в свою спецификацию.
Выполнение блока.
Итак, вы видите, что когда вы выполняете блок слишком поздно, словам уже присваивается их значение, что позволяет интерпретатору запрашивать их значения (что может вызвать оценку выражения, следовательно, E в REBOL).
Глобальный, потому что все, что там действительно когда-то выполняется,
DO и LOAD не могут автоматически связываться ни с чем, кроме глобального контекста ... потому что не существует такого понятия, как "текущий контекст", который вы имели бы в традиционных ООП и императивных языках (помните, нет контекста). Действительно, после ее выполнения этой информации больше не существует, если только вы не привязали «текущий» контекст к слову ... что и делает «SELF», но для привязки его уже нужно загрузить, который при выполнении строка, никогда не встречающаяся.
невежественные функции
В заключение я добавлю, что это может быть неочевидно с первого взгляда, но, хотя он связывал блок спецификации объекта, он все еще не знал, что на самом деле представляют собой FOO и BAR. фактически FOO и BAR могли получить доступ к объекту O только потому, что их функциональный блок, когда он выполнялся через MAKE, был привязан к объекту ... да, еще до того, как он узнал, что это функция. затем, если функция определила свои собственные локальные объекты, она повторно свяжет свой блок тела с этими новыми локальными объектами ... потому что вы догадались ... функция создает свой собственный внутренний контекст, который получает ту же обработку MAKE (но без внутреннего SELF слово).
Надеюсь, это поможет прояснить ситуацию в более очевидном свете.
вот доказательство того, что код не ограничен:
a: make object! [
data: "HAHAHAAAAA!!!"
action: does [print self/data]
]
b: make object! [
data: "BUMBLING BEHEMOT"
action: does [print self/data]
]
b/action: get in a 'action
; this will print HAHAHAAAAA!!!
b/action