Предупреждение: Absolute Lisp n00b. Я очень хорошо разбираюсь в Java и умеренно в C. Lisp ... до сих пор не был моим любимым. (Но это лучше, чем пролог ...)
Я хочу перебрать список и предпочтительно вернуть подмножество этого списка.
Я успешно написал код, который разделит список на части и перестроит его, когда стек раскручивается с помощью функции (append). Однако, когда я пытаюсь бросить в условиях, у меня возникают значительные проблемы.
(defun split-then-rebuild-list (row value llist)
(cond ((not (eq llist nil))
(let ((item (first llist))
(rval nil))
(print llist)
(print "Entering next recursion level")
(setf rval (split-then-rebuild-list row value (cdr llist)))
(print "Left recursion")
(print "Current item: ")
(princ item)
(print "Received: ")
(Princ rval)
(print "Appended:")
(setf x (first(first item)))
(and (eq row x) (eq value (nth 2 (first item)))
(print "gluing: ")
(princ rval)
(princ item)
(setf rval (append rval item )))))))
NIL продолжает возвращаться прямо вверх по стеку, пока он раскручивается. Я не понимаю, почему, когда я набираю (set tmp (list A B C) )
, тогда (append tmp nil)
возвращает (A B C)
, но не в коде, как у меня здесь. Для меня, я бы прочитал это так, что бы сказать «вернуть ноль во всех случаях, но список при этих условиях. Если два элемента списка удовлетворяют условию, они будут добавлены, в противном случае он должен просто вернуть список с предыдущего уровня рекурсии .
[ИЗДАНО] для предоставления дополнительной информации.
Моя оригинальная функция, которая прекрасно работает для разделения и восстановления:
(defun splitThenRebuildList( llist )
(cond(
(not (eq llist nil ))
(let(
(item (first llist))
(rval)
);end let decl
(print llist )
(setf rval (splitThenRebuildList( cdr llist )))
(print "item: ")(princ item)
(print "Received: ") (Princ rval)
(append rval item )
);end let
));end cond
)
Какие-либо предложения изменить это, чтобы получить то, что мне нужно, так как первый опубликованный код является аборт?