在 Common Lisp 中,逗号(,)在宏定义中有几种特定的用途,主要用于控制宏展开时参数的处理方式。以下是逗号的主要用法:
- 求值引用:
在宏的展开形式中,逗号用于引入宏参数的实际值。这允许宏在展开时对参数进行求值。
(defmacro example (x)
`(list ,x)) ; 这里,x 会被求值并插入到 list 函数调用中 - 忽略求值:
当逗号后面跟着一个 @ 符号时,它用于忽略宏参数的值,这通常用于创建生成唯一符号的宏。
(defmacro example (&optional (x ,(gensym)))
`(print ,x)) ; 使用逗号忽略 x 的值,生成一个唯一的符号 - 引用宏的剩余参数:
当逗号后面跟着一个 at 符号(@),它用于引用宏的剩余参数(rest 参数)。这通常用于处理宏中的可变数量参数。
(defmacro example (&rest args)
`(apply #'+ ,@args)) ; 这里,args 中的所有参数都会被展开并传递给 apply 函数 - 引用宏的关键字参数:
当逗号后面跟着一个 &rest 关键字,它用于引用宏的关键字参数。
(defmacro example (&key x y)
`(values ,x ,y)) - 引用宏的位置参数:
当逗号后面跟着一个 & 符号,它用于引用宏的位置参数。
(defmacro example (x &rest rest)
`(cons ,x ,rest)) ; 这里,rest 中的参数会被展开 - 引用宏的 rest 参数:
当逗号后面跟着一个 &rest 关键字,它用于引用宏的 rest 参数。
(defmacro example (&rest args)
`(apply #'+ ,@args)) ; 这里,args 中的所有参数都会被展开 - 引用宏的 key 参数:
当逗号后面跟着一个 &key 关键字,它用于引用宏的 key 参数。
(defmacro example (&key x y)
`(values ,x ,y))
这些是逗号在 Common Lisp 宏定义中的一些主要用法。逗号的使用使得宏能够以非常灵活和强大的方式来处理参数。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于