跳轉到內容

Maxima/函式

來自華夏公益教科書,開放的書籍,開放的世界

對於數學函式,始終使用

define() 

而不是

:= 

它們之間只有一個微小的差異

"函式定義運算子。f(x_1, ..., x_n) := expr 定義了一個名為 f 的函式,它具有引數 x_1, …, x_n 和函式體 expr。 := 從不評估函式體(除非透過引號-引號 '' 顯式評估)。"

"定義一個名為 f 的函式,它具有引數 x_1, …, x_n 和函式體 expr。define 始終評估其第二個引數(除非顯式引號)。 "[1]

"return 在 Maxima 中的含義與在其他程式語言中的含義不同。它只意味著從塊中返回一個值;對於您在這裡需要的內容來說,這還不夠。" Robert Dodier[2]

如果您希望從函式內部的某個表示式中返回,那麼您必須使用塊和返回。

   block ([], expr1, ..., if (a > 10) then return(a), ..., exprn)


本身就是一個表示式,因此可以代替函式定義的右側。這裡可能發生的是,返回發生在最後一個表示式之前。

區域性變數

[編輯 | 編輯原始碼]
  block ([x], expr1, ..., exprn)

塊中的第一個 [],可以包含變數和變數賦值列表,例如 [a: 3, b, c: []],這會導致三個變數 a、b 和 c 不引用其全域性值,而是具有這些特殊值,只要程式碼在塊內部執行,或者在從塊內部呼叫的函式中執行。這稱為動態繫結,因為變數從塊開始到退出時有效。從塊返回或退出塊後,將恢復變數的舊值(如果有)。用這種方式保護您的變數肯定是一個好主意。請注意,塊變數中的賦值是並行完成的。這意味著,如果您在上面使用了 c: a,則 c 的值將是您剛剛進入塊時 a 的值,但在 a 繫結之前。因此,執行類似的操作

   block ([a: a], expr1, ... a: a+3, ..., exprn)

將保護 a 的外部值不被更改,但可以讓您訪問該值是什麼。因此,賦值的右側在進入上下文之前進行評估,在任何繫結發生之前。僅使用 block ([x], ...) 會導致 x 具有其自身的值,就像您進入一個新的 Maxima 會話一樣。

另請參見 Darren Irvine 的描述[3]

  • "modedeclare 語句對於編譯程式碼很重要
  • 編譯可以極大地提高數值程式碼的速度;對於大多數符號程式碼來說,速度提高並不大。
  • 編譯程式碼和未編譯程式碼之間存在一些差異 - 請小心。" Barton Willis[4]


mode_declare

[編輯 | 編輯原始碼]

"mode_declare 告訴編譯器編譯後的程式碼不需要通用到足以處理所有型別的物件。如果您的函式只接受浮點數,而不是符號引數,則編譯後的程式碼可能會執行得快得多。" Gunter Königsmann

  1. Maxima 興趣列表中的討論
  2. stackoverflow 問題 : Maxima 中 throw、return 和 break 之間的區別
  3. Darren Irvine : 區域性變數、函式引數和
  4. maxima-discuss : 用 Maxima 編寫的檔案的編譯
華夏公益教科書