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