我正在构建一个函数,就是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
答案 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)
不是列表,而是其中一个要素,这就是为什么您得到虚线列表的原因。
以下是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)))))
现在,人们应该真正使用高阶函数或loop
来做到这一点,但是随后您发现隐藏了列表工作原理的事实。上面的代码显示了它们是否起作用。