附錄A 符式簡介(供初學者參閱)─────────────────────────────────────── 字典 符式語言是以字(就是中文的詞)及數字來表達,其間以空格做分隔: HAND OPEN ARM LOWER HAND CLOSE ARM RAISE
~FB7BB1;( 手掌 打開 手臂 放下 手掌 握起 手臂 舉起 )
上面的命令可以直接由鍵盤輸入,或者先編輯在文字檔中,再載入到記憶體內。 所有的字,不論是原已就在系統內的,或是由使用者定義後所新增的,都存放在一種 所謂"字典"的串鏈列表內(a linked list)。要想在字典中添加新字,就必須使用定義 字來達成。其中之一為『:』(冒號),它使用已經被定義而存在於字典中的字來定義出 新字。以『LIFT』一字的定義為例: : LIFT HAND OPEN ARM LOWER HAND CLOSE ARM RAISE ;
分號『;』是用來結束『LIFT』這個定義。經過此番定義之後,『LIFT』這個字就可 用來取代原來為它下定義所用的冗長字串。
字可以這樣地不斷編織下去。撰寫一份符式應用程式,就是要如此不斷地增造出更有 力的新字,一直到造出一個可以表示整個應用程式的字為止。
另一個定義字是『CODE』,它允許使用真正CPU的機器指令來定義新字。對於字的使
用者而言,他並不能分辨(也無需分辨)哪個字是用『CODE』所定義,哪個字是用『:』
所定義。『CODE』定義通常僅用在一個應用程式中執行速度最關緊要的那些部份,使用它 的機會有限。 另一個定義字是『CONSTANT』,它的用法如下: 17 CONSTANT SEVENTEEN 如此一來,『SEVENTEEN』這個字就代替了數值17。 另一個定義字是『VARIABLE』,它是為暫時的資料建立一個儲存位置。用法如下: VARIABLE BANANAS 如此一來,就保留了一個名為『BANANAS』的記憶地址空間。 去取得一個地址的內容是『@』(讀fetch )這個字的差事。其用法如下: BANANAS @ 這個片語的意思是:「取得 BANANAS 這個地址的內容」。與『@』相對應的是『!』 (讀store),它會將一個數值存入到一個地址內,見下例: 100 BANANAS ! 符式也提供另一個字,用來表示增加某一值到一個地址的內容上。見下例: 2 BANANAS +!
此片語使原來BANANAS地址的內容增加2,由100變成102。 符式另外也提供了不少的資料結構運作子,但更重要的是,她也為程式設計師提供了
一些工具,好讓他們自己去創造出應用程式所需的任何型式的資料結構。這也許是符式最 強而有力的地方之一。 在符式語言中,變數及陣列(總體性)是用來儲存被許多常式所共用,或者出現在不 可預期之時的值,它們不適用於各定義間(在本地)資料的傳送。對於此種需要,符式語 言使用了一個相當簡單的裝置:資料堆疊。 當你鍵入一個數值,它就跑上了堆疊。當你呼叫一個需要數值作為輸入引數的字,它 就會從堆疊上去取得。因此,下面這個片語 17 SPACES 就會在目前的輸出裝置上顯示出17個空格。"17"首先會將數值17堆到堆疊上,而 『SPACES』這個字會用掉它。 一個常數也會將它的值推到堆疊上,於是下面的片語 SEVENTEEN SPACES 也有相同的效果。
堆疊是依照後進先出的原則運作,也就是說,資料可以被有秩序地、像模組一般地、 依著字的執行順序一致地在字與字之間傳送。
舉例來說,一個叫做『GRID』的定義可能會呼叫『17 SPACES』這個片語。這個片語
所引發堆疊上的暫時的活動,對於呼叫『GRID』的任何其它的定義來說,都是透明而不可
見的(Transparent),因為放在堆疊上的值是在『GRID』結束之前就被處理掉了。呼叫 者(calling
definition)很可能在呼叫之前,將它自己的某些數值放到了堆疊之上。這
些數值會一直停留在堆疊上,不會有人碰它們,直到『GRID』被執行完畢,而呼叫者繼續 向下執行時。 符式語言為結構化程式設計提供了所需之各種控制結構。 『IF -- THEN』架構的語法如下: ... ( flag ) IF KNOCK THEN OPEN ... 其中flag是被放在堆疊頂端的一個值,IF 會用它做判斷(並用掉它)。非零值表示 真,零表示假。旗標若為真,則促使 IF 之後的程式碼(在本例中為『KNOCK』這個字) 被執行。THEN 這個字標記著條件子句的結尾之處,程式的執行會由『OPEN』這個字繼 續。旗標若為假,則旗標促使 IF 到 THEN 之間的程式碼不被執行。兩種狀況中任何一 種,『OPEN』都會被執行到。 ELSE 這個字允許當旗標為假時,另一個片語的執行。架構如下: ... ( flag ) IF KNOCK ELSE RING THEN OPEN ... 其中之旗標若為真,則『KNOCK』這個字就被執行,若為假,則『RING』就被執行。 不論哪種情況,執行總是自『OPEN』字再起。 符式也以下列形式提供了索引迴路(indexed loops )的控制結構: ( limit) ( index) DO ... LOOP 以及下列兩種形式的不定迴路(indefinite loops): ... BEGIN ... ( flag) UNTIL 及 ... BEGIN ... ( flag) WHILE ... REPEAT ; 完整的符式語言可參閱本人之著作 《Starting FORTH》 一書。
|