Можно ли переопределить оператор пути реболя? - PullRequest
2 голосов
/ 01 ноября 2009

Можно переопределить системные слова реболя, такие как print, make и т. Д., Так можно ли сделать то же самое с оператором пути? Тогда каков синтаксис?

Ответы [ 2 ]

3 голосов
/ 15 апреля 2010

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

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

3 голосов
/ 03 ноября 2009

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

print mold system/options

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

print mold system..options

.... где я заменил REBOL косая черта на точка точка синтаксис?

Краткий ответ: нет . Некоторые вещи встроены в синтаксический анализатор.

...