付録D 「さらなる思考の為に」問題解答

第3章

  1. 答えは、他のコンポーネントが各キーに関連付けられている数値コードを知る必要があると信じるかどうかによって異なります。 通常これはそうではありません。 したがって、より単純でよりコンパクトな形態が好ましい。 また、最初のバージョンでは、新しいキーを追加するには、2か所で変更が必要になります。

  2. RAM-ALLOTTHERE というワードの問題は、それらが時間に依存しているということです。 私たちの解決策は、順番に依存しない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 ;