2

print、makeなどのrebolシステムワードをオーバーライドすることは可能ですが、パス演算子を使用して同じことを行うことは可能ですか?では、構文は何ですか?

4

2 に答える 2

3

あなたは交換することを意味します(言う)....

print mold system/options

と(言う)...

print mold system..options

....REBOL のスラッシュドット ドット構文に置き換えた場所は?

短い答え:いいえ。パーサーに組み込まれているものもあります。

于 2009-11-03T16:30:33.480 に答える
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
}

次に、プリプロセッサ コードはすべての .. 場所を特定し、「apply-my-rule」への呼び出しを適切に挿入するようにコードを変更し、最終的に次のコードを実行します。

do load code

実行時にコード全体をどこまで処理および変更できるかについて、実質的な制限はありません (最初の例のいわゆる「ブロック モード」が最も効率的な方法です)。

于 2010-04-14T21:23:53.227 に答える