我想在常见的lisp中定义一个功能,它使用一些lisp不知道的单词/符号,例如具有这样的函数/宏:
(my-func-or-macro lst key-word idx)
,如果lst
,则会idx
中的项目返回key-word
,如果idx
,则返回key-word
{1}} 来自。
所以实际上它应该像:
(my-func-or-macro '(1 2 3 4 5 6) from 3) => '(4 5 6)
和
(my-func-or-macro '(1 2 3 4 5 6) to 3) => '(1 2 3)
由于宏不会评估他们的论点,我认为我应该使用一个不关心from
和to
的宏(注意我不想要传递引用的args,如'from
'to
)。
答案 0 :(得分:2)
由于函数的每个参数都是在执行函数之前计算的,因此需要一个符合其自身的符号。
此类符号已经是语言的一部分:特殊KEYWORD
包中的所有符号都会自行评估。用前导冒号写的符号,例如: 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)
关键字参数可以按任何顺序给出:
(my-func '(0 1 2 3 4 5) :to 4 :from 1)
=> (1 2 3)