附錄D 問題的解答

───────────────────────────────────────

第三章

 

1. 它的答案得視你是否認為其它的元件需要"知道"每個鍵相關的數值代碼而定。通常 的情況是否定的。因此,較小、較簡單的那個是你的選擇。況且,在第一個版本中, 每增加一個按鍵都要動到二個地方。 2. 『RAM-ALLOT』和『THERE』的問題在於它們都是"時序相關的";也就是,你必須依 某一種先後順序來執行它們。因此,我們的解答就是要設法找出一種能與執行順序無 關的RAM指標的界面方式。方法是,使用單一個字來同時做到這二件事。它的語法是

      : RAM-ALLOT   ( #byte-to-allot -- starting-adr )   .... ;

這樣就能使我們不論是以"向上"的方式取用RAM

      : RAM-ALLOT   ( #byte-to-allot -- starting-adr )
         >RAM @  DUP ROT +  >RAM ! ;

或是以"向下"的方式取用RAM

      : RAM-ALLOT   ( #byte-to-allot -- starting-adr )
         >RAM @  SWAP -  DUP >RAM ! ;

都有著相同語法。因此那些使用它的元件們,就可以完全地不受這個改變的影響。


第四章

我們的解答是

      52 CONSTANT #CARDS
      CREATE DECK   #CARDS ALLOT   \ one byte per card
      : 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 ;
 

 

第六章

下面的方式是一種解答

      20 CHOOSE  2 CHOOSE IF  NEGATE THEN

但這個更簡單

      40 CHOOSE  20 -