如何使用LISP中的嵌套列表

时间:2017-04-03 03:30:11

标签: nested lisp

我正在做家庭作业,第一个函数让我做一些事情,比如删除列表的给定元素,或者显示列表的给定元素。下一个功能要我删除嵌套列表,或显示它们。您是否有使用嵌套列表的一般提示?我想这些函数将与我之前编写的函数非常相似,只是稍微调整一下。

这是我到目前为止写的两个函数示例。注意我必须使用“cond”风格的写作功能。

(defun delnth(L A)
  (cond ((= A 1) (rest L))
        (t (cons (first L) (delnth (rest L) (- A 1))))))


(defun remv(A L)
  (cond ((eq A (first L)) (remv A (rest L)))
        ((null L) nil)
        (t (cons (first L) (remv A (rest L) )))))

1 个答案:

答案 0 :(得分:1)

您的两个函数都可以使用嵌套的cons'(1 2 3)(1 . (2 . (3 . ()))(cons 1 (cons 2 (cons 3 '())))。嵌套列表是您在cons的{​​{1}}中嵌套car。例如。 cons

能够看到((1 . ()) . ()) ; ==> ((1))并了解它是((1) (2 3))非常重要,这样如果您想要访问((1 . ()) . ((2 . (3 . ())) . ())),显然路径为d,a,d,a和in相反,您可以构建访问者3

cadadr部分中cons的{​​{1}}是树。当您创建一个遍历树的函数时,如果它们是cons,您需要同时移动carcar。因此:

cdr

组合器不需要缩减为原子:

cons