學習軌道
/
Factor
Factor
/
練習
/
莉亞的美味千層麵
莉亞的美味千層麵

莉亞的美味千層麵

學習練習

簡介

在 Cargo Shuffle 裡,你已經認識了 Factor 的資料堆疊,以及用來重新排列它的重排詞。這個練習會在此基礎上更進一步:你要定義的詞會用輸入計算出結果,而不只是把它們搬來搬去。

註解

!會開始一行註解,Factor 會忽略從!到行尾的所有內容。下面的範例用!來標註程式碼在做什麼,也用來說明它會印出什麼。

詞

詞是 Factor 對函式的稱呼。呼叫一個詞會從堆疊頂端彈出一些值,再推入一些值。.會彈出頂端的值並印出它;整數算術詞+、-、*會彈出兩個數字,並把結果推入堆疊:

2 3 + .    ! prints 5
8 3 - .    ! prints 5    (8 - 3, not 3 - 8)
2 3 * .    ! prints 6

相關的詞.s會印出整個資料堆疊,而且不會消耗任何值。在 listener(Factor 的互動式提示介面,你可以在那裡輸入程式碼並查看結果)裡就很方便,可以看看某段程式碼留下了什麼。後面的範例有時會以.s結尾而不是.,就是這個原因:它們在堆疊上留下不只一個值,而.s會把它們全部顯示出來。

這些算術詞屬於math這個詞彙,所以用到它們的檔案,要在USING:那一行寫上math。

堆疊效應

每個詞都會附上一份堆疊效應,形式是( inputs -- outputs )。這是這個詞的契約:它會從堆疊頂端彈出輸入,並在原處留下輸出。裡面的名稱只是為了幫助你閱讀。Factor 用不到它們,它只追蹤值在堆疊上的順序。

! + is specified as ( x y -- sum )
! . is specified as ( x   --     )

堆疊頂端是最右邊的輸入。所以8 3 -的頂端是3,堆疊效應是( x y -- difference ),結果則是8 - 3。

輸出結尾的?是「布林值」的慣例,不過千層麵這個練習只會用到數字。

下面會用到 Cargo Shuffle 裡的一個重排詞:swap ( x y -- y x ),當堆疊頂端的兩個值順序不對、會讓下一個詞出錯時,它就會把這兩個值交換過來。

定義一個詞

:會開始一個詞的定義,接著是堆疊效應,然後是詞的主體,最後由;結束。

: square ( x -- x^2 ) dup * ;

4 square .    ! => 16

Factor 的編譯器會检查主體是否真的符合宣告的堆疊效應:宣告成( x -- y )、卻在堆疊上留下零個或兩個值的詞,會編譯不過。

常數

CONSTANT:會為一個固定不變的值定義名稱。常數本身就是一個詞,呼叫它會把值推入堆疊:

CONSTANT: pi 3

pi pi * .    ! => 9

CONSTANT:是核心語法,不需要USING:那一行。請把常數放在檔案最前面,排在任何會用到它們的詞之前。

從一個詞呼叫另一個詞

詞的主體可以呼叫任何已在作用域內的詞,包括你在同一個檔案裡稍早定義的詞:

: double    ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;

5 quadruple .    ! => 20

這個練習的最後一項任務就是這樣重複使用前面的成果。

命名慣例

詞和常數都使用lowercase-kebab-case:以小寫字母組成,並用連字號連接(例如expected-bake-time、preparation-time)。

說明

在這個練習中,你會寫一些程式碼,幫你照著最愛的食譜做出美味的千層麵。

你有四個任務,全都與烹調千層麵的時間有關。

1. 將預期的烘烤時間存入常數

定義expected-bake-time常數,它應該回傳千層麵需要在烤箱裡烤幾分鐘。

根據食譜,千層麵總共需要在烤箱裡烤 40 分鐘。

expected-bake-time .
! => 40

2. 計算準備時間(以分鐘為單位)

定義preparation-time這個詞。它會從堆疊取出你加進千層麵的層數,並留下你花了多少分鐘準備,假設每一層需要 2 分鐘準備。

4 preparation-time .
! => 8

3. 計算剩餘的烘烤時間(以分鐘為單位)

定義remaining-time這個詞。它會從堆疊取出千層麵已經在烤箱裡烤過的分鐘數,並留下它還需要在裡面待多少分鐘。

25 remaining-time .
! => 15

4. 計算總工作時間(以分鐘為單位)

定義total-working-time這個詞。它會從堆疊取出兩個引數,先是千層麵的層數,然後是千層麵已經在烤箱裡的分鐘數,並留下到目前為止花費的總烹調時間:準備時間加上已經在烤箱裡的時間。

3 20 total-working-time .
! => 26
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Factor Exercism

準備好開始 莉亞的美味千層麵 了嗎?

註冊 Exercism,透過 47 個概念163 個練習 和真人引導來學習並精通 Factor,全部免費。