Macros 在通用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(注意,我

我想在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
(注意,我不想将带引号的参数,如
“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。不要忘记添加实际问题。“我想要…”不是问题。您到底想知道什么?如何比较不同软件包中的符号?