List Lisp-去掉虚线列表

List Lisp-去掉虚线列表,list,common-lisp,List,Common Lisp,我正在构建一个函数,Lisp ta反转列表的第一个和最后一个元素。我得到一个列表有一个汽车和一个cdr,因此我的输出中有一个点。有没有办法去掉斑点 (defun my-butlast (list) (loop for l on list while (cdr l) collect (car l))) (defun f-l-swap(list) (append (last list)(cdr (my-butlast list))(car list)) ) (w

我正在构建一个函数,Lisp ta反转列表的第一个和最后一个元素。我得到一个列表有一个
汽车
和一个
cdr
,因此我的输出中有一个点。有没有办法去掉斑点

(defun my-butlast (list)
  (loop for l on list
      while (cdr l)
      collect (car l)))

(defun f-l-swap(list)
  (append (last list)(cdr (my-butlast list))(car list))
 )

(write(f-l-swap '(A B C D E)))

OUTPUT:
(E B C D . A)

append
要求参数为列表。在你的例子中,
(汽车列表)
是一个原子。如果您想继续使用
append
,则必须将其更改为list。即:

(defun f-l-swap (list)
  (append (last list)
          (cdr (my-butlast list))
          (list (car list))))

append
要求参数为列表。在你的例子中,
(汽车列表)
是一个原子。如果您想继续使用
append
,则必须将其更改为list。即:

(defun f-l-swap (list)
  (append (last list)
          (cdr (my-butlast list))
          (list (car list))))

列表是由
cons
对组成的链。例如,
(1233)
(1233)()的可视化。如果最后一个
cdr
不是
()
,那么我们称之为虚线列表,因为没有最后一个部分的简化可视化。它必须用圆点印刷

你有
(E.(B.(C.(D.A))
,你想拥有
(E.(B.(C.(D)(A)())
。你看到区别了吗<代码>(汽车列表)
不是一个列表,而是一个元素,这就是为什么你会得到一个虚线列表

下面是
append
butlast
的更合理的实现:

(defun my-append (a b)
  (if (null a)
      b
      (cons (car a) (my-append (cdr a) b))))
这只支持2个参数,但更多的想法是,它将继续,直到您使用了前面的所有列表,并且只剩下一个,逐字逐句成为尾部。下面是可能的情况:

(defun my-append2 (x &rest xs)
  (labels ((helper (x xs)
             (cond ((null xs) x)
                   ((null x) (helper (car xs) (cdr xs)))
                   (t (cons (car x) (helper (cdr x) xs))))))
    (helper x xs)))
这里是
butlast

(defun my-butlast (xs)
  (if (null (cdr xs))
      '()
      (cons (car xs) (my-butlast (cdr xs)))))

现在,我们应该使用高阶函数或
循环
,但这样就隐藏了列表如何工作的事实。上面的代码显示了它们的工作原理

列表是由
cons
对组成的链。例如,
(1233)
(1233)()的可视化。如果最后一个
cdr
不是
()
,那么我们称之为虚线列表,因为没有最后一个部分的简化可视化。它必须用圆点印刷

你有
(E.(B.(C.(D.A))
,你想拥有
(E.(B.(C.(D)(A)())
。你看到区别了吗<代码>(汽车列表)
不是一个列表,而是一个元素,这就是为什么你会得到一个虚线列表

下面是
append
butlast
的更合理的实现:

(defun my-append (a b)
  (if (null a)
      b
      (cons (car a) (my-append (cdr a) b))))
这只支持2个参数,但更多的想法是,它将继续,直到您使用了前面的所有列表,并且只剩下一个,逐字逐句成为尾部。下面是可能的情况:

(defun my-append2 (x &rest xs)
  (labels ((helper (x xs)
             (cond ((null xs) x)
                   ((null x) (helper (car xs) (cdr xs)))
                   (t (cons (car x) (helper (cdr x) xs))))))
    (helper x xs)))
这里是
butlast

(defun my-butlast (xs)
  (if (null (cdr xs))
      '()
      (cons (car xs) (my-butlast (cdr xs)))))
现在,我们应该使用高阶函数或
循环
,但这样就隐藏了列表如何工作的事实。上面的代码显示了它们的工作原理