Scheme 程式設計/使用變數
外觀
為了使您的程式更具動態性,通常需要宣告一個變數。 有兩種主要的方法,使用 define 和 let。 兩者的區別一旦完全掌握就很容易理解。
例如,使用 define
> (define x 2)
#<unspecified>
> (* x 3)
6
> x
2
這表明即使變數 x 被使用過,它仍然存在,它被定義為所有人都可以檢視、使用和(正如我們將在後面看到)隨意修改。
一般來說,變數的 define 語句的形式如下
(define <variable name> <variable value>)
現在我們將看到 let 的用法
> (let ((x 2) (y 4)) (* x y))
8
> x
;ERROR: "/usr/lib/scm/Iedline.scm": unbound variable: x
> y
;ERROR: "/usr/lib/scm/Iedline.scm": unbound variable: y
注意這裡,當代碼塊執行完畢後,變數 x 和 y 將不再可用。 現在,這是一種非常笨拙和緩慢的方法,但它允許在以後編寫更優雅的程式。
一般來說,let 語句的形式如下
(let ((var1 val1) ... (varn valn)) (<body>))
Scheme 中的變數是動態型別的,因此在定義變數時無需宣告變數的型別。 此外,如果您想更改變數的值,您可以將其更改為任何您喜歡的值 - 相同的變數可以儲存任何型別的資料。 當一個函式返回兩種不同型別的值,而您希望儲存結果在一個變數中而不管結果是什麼時,這將很有益。
(define f
(lambda(x)
(cond
((= x 3) 5)
(else "Error: Invalid input!"))))
(define y (f 5))
如果我們使用的是像 Java 這樣的語言,它使用靜態型別,這是不允許的。 正如示例所示,動態型別的常見用法是讓一個函式返回一種型別的值(例如數字)如果函式呼叫成功,則返回另一種型別的值(這裡是一個字串)如果函式失敗。 當然,儘管有動態型別,但諸如嘗試將兩個符號相乘之類的邏輯操作仍然會失敗,因此當一個函式返回兩種可能型別時,請確保在嘗試使用它之前確定實際返回的值的型別。