Macros 在通用Lisp函数/宏中引入新符号
我想在common lisp中定义一个功能,它使用一些lisp不知道的单词/符号,例如,具有这样一个函数/宏:Macros 在通用Lisp函数/宏中引入新符号,macros,common-lisp,Macros,Common Lisp,我想在common lisp中定义一个功能,它使用一些lisp不知道的单词/符号,例如,具有这样一个函数/宏: (my-func-or-macro lst key-word idx) 如果关键字为至,则将lst中的项目返回至idx,如果关键字为至,则将idx中的项目返回至末尾 所以实际上,它应该像: (my-func-or-macro '(1 2 3 4 5 6) from 3) => '(4 5 6) 及 由于宏不计算它们的参数,我想我应该使用一个宏,它不关心from和to(注意,我
(my-func-or-macro lst key-word idx)
如果关键字
为至,则将lst
中的项目返回至idx
,如果关键字
为至,则将idx
中的项目返回至末尾
所以实际上,它应该像:
(my-func-or-macro '(1 2 3 4 5 6) from 3) => '(4 5 6)
及
由于宏不计算它们的参数,我想我应该使用一个宏,它不关心
from
和to
(注意,我不想将带引号的参数,如“from
”传递到
) 由于函数的每个参数都是在函数执行之前求值的,因此需要一个自身求值的符号
这样的符号已经是语言的一部分:特殊关键字包中的所有符号都会自行计算。用前导冒号书写的符号,例如。g<代码>:foo
被插入到该包中
语言的另一部分是关键字参数,它们使用这些关键字来标识参数:
(defun my-func (list &key from)
(subseq list from))
(my-func '(0 1 2 3 4 5) :from 3)
=> (3 4 5)
(defun my-func (list &key (from 0) (to (length list)))
(subseq list from to))
(my-func '(0 1 2 3 4 5) :from 3)
=> (3 4 5)
(my-func '(0 1 2 3 4 5) :to 3)
=> (0 1 2)
(my-func '(0 1 2 3 4 5) :from 1 :to 4)
=> (1 2 3)
您可以为这些参数提供默认值:
(defun my-func (list &key from)
(subseq list from))
(my-func '(0 1 2 3 4 5) :from 3)
=> (3 4 5)
(defun my-func (list &key (from 0) (to (length list)))
(subseq list from to))
(my-func '(0 1 2 3 4 5) :from 3)
=> (3 4 5)
(my-func '(0 1 2 3 4 5) :to 3)
=> (0 1 2)
(my-func '(0 1 2 3 4 5) :from 1 :to 4)
=> (1 2 3)
关键字参数可以按任意顺序给出:
(my-func '(0 1 2 3 4 5) :to 4 :from 1)
=> (1 2 3)
通常,您会使用带有关键字参数的函数::from和:to。不要忘记添加实际问题。“我想要…”不是问题。您到底想知道什么?如何比较不同软件包中的符号?