Другим возможным подходом является использование возможностей метапрограммирования REBOL и предварительной обработки вашего собственного кода для отслеживания доступа к путям и добавления кода вашего обработчика. Вот пример:
apply-my-rule: func [spec [block!] /local value][
print [
"-- path access --" newline
"object:" mold spec/1 newline
"member:" mold spec/2 newline
"value:" mold set/any 'value get in get spec/1 spec/2 newline
"--"
]
:value
]
my-do: func [code [block!] /local rule pos][
parse code rule: [
any [
pos: path! (
pos: either object? get pos/1/1 [
change/part pos reduce ['apply-my-rule to-block pos/1] 1
][
next pos
]
) :pos
| into rule ;-- dive into nested blocks
| skip ;-- skip every other values
]
]
do code
]
;-- example usage --
obj: make object! [
a: 5
]
my-do [
print mold obj/a
]
Это даст вам:
-- path access --
object: obj
member: a
value: 5
--
5
Другим (более медленным, но более гибким) подходом также может быть передача вашего кода в строковом режиме препроцессору, позволяющая освободиться от любого специального синтаксического правила REBOL, например:
my-alternative-do {
print mold obj..a
}
Код препроцессора затем определит все .. места и изменит код для правильной вставки вызовов 'apply-my-rule, и в конце запустит код с:
do load code
Нет реальных ограничений на то, как далеко вы можете обрабатывать и изменять весь ваш код во время выполнения (так называемый «блочный режим» первого примера является наиболее эффективным способом).