【问题标题】:Introducing new symbols into Common-Lisp Function/Macro将新符号引入 Common-Lisp 函数/宏
【发布时间】:2017-10-12 10:33:44
【问题描述】:

我想在 common lisp 中定义一个功能,它使用一些 lisp 不知道的单词/符号,例如具有这样的函数/宏:

(my-func-or-macro lst key-word idx)

如果key-wordto,则返回lstidx 中的项目,如果key-word来自idx 到末尾/强>。

所以实际上它应该像这样工作:

(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 的宏(注意我不想传递引用的参数,如 'from 'to )。

【问题讨论】:

  • 通常你会使用带有关键字参数的函数: :from 和 :to 。
  • 不要忘记添加实际问题。'我想要...'不是问题。
  • 您到底想知道什么?如何比较不同包中的符号?

标签: macros common-lisp


【解决方案1】:

由于函数的每个参数都在函数执行之前进行评估,因此您需要一个对其自身进行评估的符号。

这样的符号已经是语言的一部分:特殊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)

【讨论】:

    猜你喜欢
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多