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
广告