Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 从Lisp中的列表中删除最后两个元素_Common Lisp - Fatal编程技术网

Common lisp 从Lisp中的列表中删除最后两个元素

Common lisp 从Lisp中的列表中删除最后两个元素,common-lisp,Common Lisp,我需要从公共列表中的列表中删除最后两个元素,但我只能删除一个。怎么走 (defun my-butlast (list) (loop for l on list while (rest l) collect (first l))) 简单:反转,弹出,弹出,反转;-)1 更有效的是,以下措施也能起作用: (let ((list '(a b c d))) (loop for x in list for y

我需要从公共列表中的列表中删除最后两个元素,但我只能删除一个。怎么走

(defun my-butlast (list)
        (loop for l on list
              while (rest l)
              collect (first l)))
简单:反转,弹出,弹出,反转;-)1

更有效的是,以下措施也能起作用:

(let ((list '(a b c d)))
  (loop 
    for x in list
    for y in (cddr list)
    collect x))
对于某些任意的L和N,也可以这样写:

(mapcar #'values L (nthcdr N L)) 
它之所以有效,是因为在多个列表上的迭代以最短列表为界。这里重要的是第二个列表的长度(我们不关心它的值),它是原始列表的长度减去N,当该值为正时,或者为零。请注意,可以方便地处理大于参数中给出的列表长度的大小。在第二个例子中,我使用该函数作为广义恒等式函数;仅使用计算值的主值,因此这可以根据需要工作。 该行为与实际的2函数一致,该函数返回大于列表中元素数N的
nil
。实际的
BUTLAST
功能也可以处理不正确的(虚线)列表,但上述版本不能


1.
(亚历山大:撰写#nreverse#cddr#reverse)


2.
但最后一个
被指定为等同于
(ldiff list(last list n))
。我完全忘记了生命的存在

标准中有这样一个函数:,或者如果您愿意修改输入列表,

butlast返回一个列表副本,其中省略了最后n个conses。如果未提供n,则其值为1。如果列表中的conses少于n,则返回nil,如果是nbutlast,则不会修改列表

nbutlast类似于butlast,但nbutlast可以修改列表。它将cons n+1的cdr从列表末尾更改为nil

示例:

CL-USER> (butlast '(1 2 3 4 5) 2)
(1 2 3)
CL-USER> (nbutlast (list 6 7 8 9 10) 2)
(6 7 8)
你调用了你的函数my butlast这一事实表明你可能知道这个函数,但你没有提到不想使用这个函数,所以我认为这仍然是一个公平的游戏。完成它很容易:

CL-USER> (defun my-butlast (list)
           (butlast list 2))
MY-BUTLAST
CL-USER> (my-butlast (list 1 2 3 4))
(1 2)

while(rest(restl))
?@melpomene我在尝试不同的方法来实现它
(如果原子(1234)5)移除:计数2:从t端开始)
=>
(1234))
@jkiiski你能不能将它集成到a函数中。plz MyList=(ABCD)…我正在尝试编写一个函数来从列表中移除CD。这样它就变成了Mylist=(A B)
(subseq list:start 0:end(-(length list)2))
-这将是我的goto解决方案,在这种情况下,它也可以与pain
cddr一起工作。这是如何编写的,尽管您可以将其作为一个通用函数,将购买金额作为一个参数。@Sylwester是的,在示例中使用CDDR并在之后进行概括更有意义。谢谢,没必要这样。但Last存在于标准中,并接受可选的第二个参数,该参数指定要排除的元素数。我补充说。