付録D 「さらなる思考の為に」問題解答¶
第3章¶
答えは、他のコンポーネントが各キーに関連付けられている数値コードを知る必要があると信じるかどうかによって異なります。 通常これはそうではありません。 したがって、より単純でよりコンパクトな形態が好ましい。 また、最初のバージョンでは、新しいキーを追加するには、2か所で変更が必要になります。
RAM-ALLOT
とTHERE
というワードの問題は、それらが時間に依存しているということです。 私たちの解決策は、順番に依存しないRAM割り当てポインタへのインタフェースを考案することでしょう。 これを行う方法は、両方の機能を透過的に実行するただ一つのワードを持つことです。私たちのワードの構文は次のようになるでしょう。
: RAM-ALLOT ( #bytes-to-allot -- starting-adr)
... ;
この構文は、上方向に成長するように割り当てるように定義しても変わりません。
: RAM-ALLOT ( #bytes-to-allot -- starting-adr)
>RAM @ DUP ROT + >RAM ! ;
または下向きに成長するように割り当てるには次のようにします。
: RAM-ALLOT ( #bytes-to-allot -- starting-adr)
>RAM @ SWAP - DUP >RAM ! ;
第4章¶
私たちの解決策は以下の通りです。
0 1 2 3 4 5 6 7 8 9 10 | \ CARDS Shuffle 6-20-83
52 CONSTANT #CARDS
CREATE DECK #CARDS ALLOT \ one card per byte
: CARD ( i -- adr) DECK + ;
: INIT-DECK #CARDS 0 DO I I CARD C! LOOP ;
INIT-DECK
: 'CSWAP ( a1 a2 -- ) \ swap bytes at a1 and a2
2DUP C@ SWAP C@ ROT C! SWAP C! ;
: SHUFFLE \ shuffle deck of cards
#CARDS 0 DO I CARD #CARDS CHOOSE CARD 'CSWAP
LOOP ;
|
第8章¶
: DIRECTION ( n|-n|0 -- 1|-1|0) DUP IF 0< 1 OR THEN ;