Можно использовать системные слова rebol, такие как print, make и т. Д., Можно ли сделать то же самое с оператором пути? Тогда какой синтаксис?Можно ли переопределить оператор пути репо?
ответ
Другим возможным подходом является использование возможностей метапрограммирования 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
}
код препроцессор затем определить все .. места и изменить код, чтобы правильно вставить вызовы на «применить-моему-правила, и было бы в т он конец, запустить код с:
do load code
Там нет никаких реальных ограничений на том, как далеко вы можете обработать и изменить весь свой код во время выполнения (так называемый режим «блок» в первом примере является наиболее эффективным способом).
Вы имеете в виду заменить (скажем) ....
print mold system/options
с (скажем) ....
print mold system..options
.... где я заменил для Rebol слеш с dot dot синтаксис?
Короткий ответ: нет. Некоторые вещи жестко привязаны к парсеру.
Невероятно, это было бы полезно, если бы вставляли некоторые бизнес-правила для доступа к объектам. –
Возможно, вы могли бы использовать форму [get in system 'options] ... [set in system' options 9999]. Оберните это в функцию, и вы можете добавить туда свои собственные уровни кода. – Sunanda
Очень интересное спасибо за исходный код, будет играть с ним. –