前面我們使用到一些人家已經寫好程式的函數,如solve(),diff()等等,我們在使用這些函數的時後,只需要輸入函數要求的數據,就可以得到相應的結果,然而有時我們也許會有需要,自訂自已的函數,舉例來說,今天我們希望能有一個函數,能夠將使用者輸入的數值乘以100倍,也就是說,當我們輸入函數名(5) ,結果會得到500。在這裡請不要在意這個函數有多麼無聊,因為這不是重點,這裡主要要說明的是如果編寫一個簡單的Maxima函數。
編寫函數前,第一件事就是要決定函數名稱,函數名稱有些規則,第一:只能使用英文和數字含底線符號等字元組成的函數名,第二:開頭的第一個字必須是英字字元,第三:函數名稱有區分大小寫,以下幾個名稱包含了正確和錯誤的命名:
- program1 -----------正確
- PROGRAM_1 -----正確
- 程式1 ----------------錯誤
- 1program -----------錯誤
因為這是本站第一個函數的教學,筆者就將它取名為first。編寫這個程式真的很簡單,但我們先不管這個函數要怎麼寫,我們先從first函數應該要怎麼運作開始思考,當我們輸入first(5),按下輸入後,maxima應該要輸出結果500,下面這行短短的幾個字,就可以完成我們需要的操作:
first(x):=block([n:x],n*100);
將上面的代碼輸入到maxima內,然後再輸入first(5),看看結果是不是會得到500。
函數詳解
接著就來說明那段程序的意義。上面那段程序就是標準的maxima函數,我們要把它分成兩部分來看,第一部分就是first(x),這一部份表示函數的輸入方式,函數名稱first,帶一個變數x。而第二部分就是block([n:x],n*100),這部分負責函數的實際運算方式,開頭的block是規定寫法, 如果沒有加上block,程序不會出錯,但會產生某些問題,有時這會嚴重影響計算的正確性,後面會說明。
同樣的在block括號內的程式,也要分成兩部分來看,第一部分是[n:x],,這邊先注意一點,因為函數不只有一段程式,所以彼此之間必須以「,(逗號)」做分隔,如果是最後一段程序,則不能加上逗號,這點要注意。再回到[n:x],這段的意思是「將x的值指定給n」,以這個函數而言,這一段實在是有點多此一舉,讀者可以試著把第一段刪掉(記得連逗號也要刪掉),再將原本的n*100改成x*100,一樣可以得到相同的結果,目前讀者還不了解這段的意義,因為後面的章節會再說明,所以當前你就照打就對了。最後一段就是把n乘上100,maxima會自動將最後一行的結果輸出到螢幕上,所以如果你輸入first(2),maxima就會輸出200。
接著再回到[n:x],這邊請讀者將原本的方括號去掉,變成n:x,完畢後記得按enter或shift+enter,再執行first(2)一次,相信結果一樣是200,那麼方括號的用處是什麼,請讀者直接輸入n,執行,maxima應該會輸入2,也就是說現在n已經被賦予2這個值,但是有時我們並不希望這種情況發生,我們在函數使用的變數,我們希望在函數結束後,變數也會自動銷毀,要達到這個結果就是使用方括號,程式結束後,maxima會自動幫我們銷毀方括號內的變數,現在讀者手動銷毀n變數,還記得是哪個函數嗎?
kill(n):使用這個函數。
然後把原本刪除的方括號加回去,再重新執行一次,再執行first(2),然後再執行n,執行n的時後,maxima會直接輸出n,而不是2,這表示n沒有被賦值。
前面提到方括號內的變數都會在程式結束後被銷毀,那麼x是不是也會被銷毀,答案是不會,因為x一開始就是全域變數,是無法被銷毀的。