Forth

Forth

困難

說明

為 Forth 的一個非常簡單的子集實作評估器。

Forth 是一種以堆疊為基礎的程式語言。請為 Forth 的一小部分子集實作一個最基本的評估器。

你的評估器必須支援以下詞彙:

  • +、-、*、/(整數運算)
  • DUP、DROP、SWAP、OVER(堆疊操作)

你的評估器也必須支援以慣用語法定義新的詞彙:: word-name definition ;。

為了保持簡單,你只需要支援一種資料型態:至少 16 位元大小的有號整數。

你應該採用以下語法規則:數字是由一個或多個(ASCII)數字字元組成的序列,詞彙則是由一個或多個字母、數字、符號或標點符號組成、且本身不是數字的序列。 (Forth 的規則可能略有不同,但這樣已經夠接近了。)

詞彙不分大小寫。

實作

在 Forth 裡,函式被稱為words,它們在資料堆疊上運作。 每個 word 會從堆疊取出參數,並把結果回傳到堆疊上。

Forth 的文件總是以( p1 p2 ... pN --- r1 r2 ... rN )這樣的形式,記載 word 執行前與執行後的資料堆疊狀態。 p1到pN代表呼叫前堆疊上的 word 參數(堆疊更上方可能還有這裡未列出的資料),而r1到rN代表呼叫後堆疊上的 word 回傳值。 分隔符---用來區分 word 執行前後的堆疊狀態。

要實作的 word 定義如下:

  • ToS 代表堆疊頂端
  • 堆疊頂端以最右邊的值表示
word 堆疊狀態 說明
+ ( a b --- sum ) sum = a + b
- ( a b --- diff ) diff = a - b
* ( a b --- prod ) prod = a * b
/ ( a b --- quot ) quot = a / b
dup ( a --- a a ) duplicate the value on the ToS
drop ( a --- ) drop the value on the ToS
swap ( a b --- b a ) swap the two values on the ToS
over ( a b c --- a b c b ) copy the 2nd value to the ToS

如果你想玩玩看線上的 Forth 翻譯員,或是想進一步了解要實作的這些 word,可以試試 Easy Forth (特別是 Adding Some Numbers、Defining Words 和 Stack Manipulation 這幾個部分)。

透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Odin Exercism

準備好開始 Forth 了嗎?

註冊 Exercism,透過 73 個練習 和真人引導來學習並精通 Odin,全部免費。