Lisp - 宏



宏允許您擴充套件標準 LISP 的語法。

從技術上講,宏是一個函式,它以 s-表示式作為引數,並返回一個 LISP 表示式,然後對其進行求值。

定義宏

在 LISP 中,命名宏是使用另一個名為defmacro的宏定義的。定義宏的語法為:

(defmacro macro-name (parameter-list))
"Optional documentation string."
body-form

宏定義包括宏的名稱、引數列表、可選的文件字串以及定義宏要執行的任務的 Lisp 表示式體。

示例 - 建立宏

讓我們編寫一個名為 setTo10 的簡單宏,它將接收一個數字並將它的值設定為 10。

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

main.lisp

; define a macro accepting a number
(defmacro setTo10(num)
; set the num as 10 and print it
(setq num 10)(print num))
; set a variable x as 25
(setq x 25)
; print the variable
(print x)
; call the macro
(setTo10 x)

輸出

單擊“執行”按鈕或鍵入 Ctrl+E 時,LISP 會立即執行它,並返回以下結果:

25
10

示例 - 帶有多個引數的宏

讓我們編寫另一個名為 setValue 的宏,它將接收兩個引數並將它們更新為新值。

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

main.lisp

; define a new macro accepting three values
(defmacro setValue(num1 num2 value)
(progn
   ; assign value to num1
   (setq num1 value)
   ; assing value to num2
   (setq num2 value))
   ; print num1 and num2
   (print num1)
   (print num2)
)
; define paramters	
(defparameter num1 1)
(defparameter num2 2)

; print the paramters before macroo
(print "Values: ")
(print num1)
(print num2)

; print parameters in macros
(print "Values within macro: ")
(setValue num1 num2 3)

; print parameters after running macro, values will be unaffected
(print "Values after macro: ")
(print num1)
(print num2)

輸出

單擊“執行”按鈕或鍵入 Ctrl+E 時,LISP 會立即執行它,並返回以下結果:

"Values: "
1
2
"Values within macro: "
3
3
"Values after macro: "
1
2
廣告