Common Lisp 将列表的成员从一个索引返回到另一个索引

Common Lisp Returning members of a list from one index to another

这是我到目前为止尝试过的方法,但我遇到了一些错误,我有点困惑

想做的是:

例如调用(子列表((2 3 4 5 6)2 3)) 将导致像

这样的递归函数

x = 1,(子列表('(3 4 5 6) 2 3))

x = 2, cons (car ls) (sub-list((4 5 6) 2 3))

x = 3 ,cons (car ls) (sub-list((5 6) 2 3))

x = 4 , nil 因为 x 现在大于 to.

它应该回溯到 return (4 5) 类似的东西

(defvar *x* 1)      

(defun sub-list(ls from to)
    (cond
        ((<= *x* from) (sub-list((cdr ls) from to)))
        ((<= from *x* to)
            (let (*x* (+ *x* 1))
                cons a (sub-list((cdr ls) from to)))))
        ((> *x* to) nil)))     

作为一般建议,不建议使用全局和特殊变量来跟踪内部状态。

正如@coredump 在评论中指出的那样,Sublist in Lisp 有一个指向正确方向的答案。

为了避免特殊变量,您可以(原则上)更改开始和结束索引(正如@ScottHunter 所指出的)。

这意味着您可以将“开始累积”从 (<= *x* from) 更改为 (<= from 0),将“结束累积”更改为 (<= to 0)

这还需要将每个递归调用更改为类似 (sub-list (cdr list) (1- from) (1- to)) 的形式(并消除初始跳过阶段中的错误,在该阶段您不会递增 *x*)。