2009-11-01 3 views

ответ

3

Другим возможным подходом является использование возможностей метапрограммирования 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 

Там нет никаких реальных ограничений на том, как далеко вы можете обработать и изменить весь свой код во время выполнения (так называемый режим «блок» в первом примере является наиболее эффективным способом).

+0

Очень интересное спасибо за исходный код, будет играть с ним. –

3

Вы имеете в виду заменить (скажем) ....

print mold system/options 

с (скажем) ....

print mold system..options 

.... где я заменил для Rebol слеш с dot dot синтаксис?

Короткий ответ: нет. Некоторые вещи жестко привязаны к парсеру.

+0

Невероятно, это было бы полезно, если бы вставляли некоторые бизнес-правила для доступа к объектам. –

+0

Возможно, вы могли бы использовать форму [get in system 'options] ... [set in system' options 9999]. Оберните это в функцию, и вы можете добавить туда свои собственные уровни кода. – Sunanda

Смежные вопросы