在Common-Lisp函数/宏中引入新符号

时间:2017-10-12 10:33:45

标签: macros common-lisp

我想在常见的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)

由于宏不会评估他们的论点,我认为我应该使用一个不关心fromto的宏(注意我不想要传递引用的args,如'from 'to)。

1 个答案:

答案 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)