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