OpenBoot では、アセンブル済みの Forth ワードの定義を高水準の Forth 言語を使用して変更できます。変更は、通常、該当するソースコードで行われるのに対して、patch 機能はデバッグ時に見つけられなかった誤りを迅速に修正する手段を提供します。
patch は次に示す各情報から入力ストリームを読みます。
挿入される新しいコードの名前
置き換えられる古いコードの名前
古いコードが入っているワードの名前
たとえば、次の例を考えてください。この例では、ワード test が数値 555 に置き換えられます。
ok : patch-me test 0 do i . cr loop ; ok patch 555 test patch-me ok see patch-me : patch-me h# 555 0 do i . cr loop ; |
patch を使用するときは、十分注意して正しいワードを選択し、置き換える必要があります。置き換えようとするワードがターゲットワード内で数回使用され、ターゲットワード内で最初に出てくるものではなく、何番目かに出てくるワードである場合は、特に注意が必要です。そのような場合は、なんらかの回避手段が必要です。
ok : patch-me2 dup dup dup ( This third dup should be drop) ; ok : xx dup ; ok patch xx dup patch-me2 ok patch xx dup patch-me2 ok patch drop dup patch-me2 ok see patch-me2 : patch-me2 xx xx drop ; |
patch のもう 1 つの用途は、パッチするワードに、完全に廃棄する必要がある特定の機能がある場合です。そのような場合は、機能を削除する最初のワードに対してワード exit をパッチします。たとえば、次のような定義をもつワードを考えてみてください。
ok : foo good bad unneeded ; |
この例では、bad の機能は誤っており、unneeded の機能は廃棄する必要があります。
ok : right this that exit ; ok patch right bad foo |
foo をパッチしようとするとき、最初は、ワード right 内に exit を使用すればunneeded を実行できなくできると期待して、次のように入力するかもしれません。 exit は、それが入っているワード、この場合 right の実行を終了させてしまいます。foo の正しいパッチ方法は次のようになります。
ok : right this that ; ok patch right bad foo ok patch exit unneeded foo |
(patch) は、その引数をスタックから得る点を除いて patch と同じです。(patch) のスタックダイアグラムは次のとおりです。
( new-n1 num1? old-n2 num2? xt -- )
ただし、
new-n1 と old-n2 は実行トークン、数値のどちらでも差し支えありません。
num1? と num2? はフラグであり、それぞれ、new-n1 または old-n2 が数値であるかどうかを示します。
xt はパッチを実行するワードの実行トークンです。
たとえば、次の例を考えてみてください。ここでは、数値 555 を test に置き換えて、最初の patch の例の効果を逆にしています。
ok see patch-me : patch-me h# 555 0 do i . cr loop ; ok ['] test false 555 true ['] patch-me (patch) ok see patch-me : patch-me test 0 do i . cr loop ; |