Lisp-摆脱虚线列表

时间:2018-11-05 17:52:19

标签: list common-lisp

我正在构建一个函数,就是Lisp ta反转了列表的第一个和最后一个元素。我得到一个列表有一个function validateMethod(){ var inp1 = document.getElementById('input1').value; var inp2 = document.getElementById('input2').value; var inp3 = document.getElementById('input3').value; if(!inp1 || !inp2 || !inp3) { document.getElementById('ErrorMessage').innerHTML = "Please enter all fields"; return false; } else{ //do your code here document.getElementById('ErrorMessage').innerHTML = ""; return true; } } 和一个car,因此为什么我的输出中有一个点。有没有办法删除点?

cdr

2 个答案:

答案 0 :(得分:2)

append期望参数为列表。在您的情况下,(car list)是一个原子。如果要坚持使用append,则必须将其更改为列表。即:

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

答案 1 :(得分:1)

列表是一对cons对的链。例如。 (1 2 3)(1 . (2 . (3 . ())))的可视化。如果最后一个cdr不是(),那么您就拥有了一个虚线表,因为这样就不会简化最后一个部分的可视化。它必须印有一个点。

您有(E . (B . (C . (D . A)))),并想拥有(E . (B . (C . (D . (A . ())))))。你看得到差别吗? (car list)不是列表,而是其中一个要素,这就是为什么您得到虚线列表的原因。

以下是appendbutlast的更明智的实现:

(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)))))

现在,人们应该真正使用高阶函数或loop来做到这一点,但是随后您发现隐藏了列表工作原理的事实。上面的代码显示了它们是否起作用。