Lisp - 變數



在 LISP 中,每個變數都由一個符號表示。變數的名稱是符號的名稱,它儲存在符號的儲存單元中。

全域性變數

全域性變數在整個 LISP 系統中具有永久值,並在指定新值之前一直有效。

全域性變數通常使用defvar結構宣告。

main.lisp

; define a global variable x with a value of 234
(defvar x 234)
; print value of x
(write x)

輸出

當您點選“執行”按鈕或鍵入 Ctrl+E 時,LISP 會立即執行它,並返回結果

234

由於 LISP 中沒有變數的型別宣告,因此您可以使用setq結構直接為符號指定一個值。

例如

; set value of x as 10
->(setq x 10)

上述表示式將值 10 賦給變數 x。您可以使用符號本身作為表示式來引用變數。

symbol-value函式允許您提取儲存在符號儲存位置的值。

示例 - 全域性變數

建立一個名為 main.lisp 的新原始碼檔案,並在其中鍵入以下程式碼。

main.lisp

; set x as 10
(setq x 10)
; set y as 20
(setq y 20)
; print x and y
(format t "x = ~2d y = ~2d ~%" x y)

; update value of x as 100
(setq x 100)
; update value of y as 200
(setq y 200)
; print updated values of x and y
(format t "x = ~2d y = ~2d" x y)

輸出

當您點選“執行”按鈕或鍵入 Ctrl+E 時,LISP 會立即執行它,並返回結果。

x = 10 y = 20 
x = 100 y = 200

區域性變數

區域性變數在給定的過程中定義。在函式定義中作為引數命名的引數也是區域性變數。區域性變數僅在相應的函式內可訪問。

與全域性變數一樣,也可以使用setq結構建立區域性變數。

還有另外兩種結構 - letprog用於建立區域性變數。

let 結構具有以下語法。

(let ((var1  val1) (var2  val2).. (varn  valn))<s-expressions>)

其中 var1、var2、..varn 是變數名,val1、val2、.. valn 是分配給相應變數的初始值。

let執行時,每個變數都分配相應的值,最後s-表示式被求值。返回最後求值的表示式的值。

如果您不為變數包含初始值,則將其分配給nil。

示例 - 使用 let

建立一個名為 main.lisp 的新原始碼檔案,並在其中鍵入以下程式碼。

main.lisp

; declare loca variables x, y and z and initialize them with a, b and c
(let ((x 'a) (y 'b)(z 'c))
; print values of x, y and z
(format t "x = ~a y = ~a z = ~a" x y z))

輸出

當您點選“執行”按鈕或鍵入 Ctrl+E 時,LISP 會立即執行它,並返回結果。

x = A y = B z = C

prog結構也將其第一個引數作為區域性變數列表,後面跟著prog的主體,以及任意數量的 s-表示式。

prog函式按順序執行 s-表示式的列表,並返回 nil,除非它遇到名為return的函式呼叫。然後,return函式的引數被求值並返回。

示例 - 使用 prog

建立一個名為 main.lisp 的新原始碼檔案,並在其中鍵入以下程式碼。

main.lisp

; declare variables and assign thm list of values
(prog ((x '(a b c))(y '(1 2 3))(z '(p q 10)))
; print variables
(format t "x = ~a y = ~a z = ~a" x y z))

輸出

當您點選“執行”按鈕或鍵入 Ctrl+E 時,LISP 會立即執行它,並返回結果。

x = (A B C) y = (1 2 3) z = (P Q 10)
廣告