Moar LISP

Că am tot avut discuții cu câțiva colegi legat de anumite probleme la LISP, voi posta re­zolvările la unele (mai cerute de public) și, dacă am chef, le și explic.

First off:

Sa se scrie o functie care plecand de la o lista data ca argument, inverseaza numai secventele continue de atomi. Exemplu:

(a b c (d (e f) g h i)) ==> (c b a (d (f e) i h g))

(defun invers(l)
    (invers_aux l nil)
)
(defun invers_aux(l sir)
    (cond
        ((null l) sir)
        ((atom (car l))
            (invers_aux (cdr l) (append (list (car l)) sir)))
        ((listp (car l))
            (append sir
                (list(invers_aux (car l) nil))
                (invers_aux (cdr l) nil)))
    )
)
  1. Definiti o functie care substituie un element E prin elementele unei liste L1 la toate nivelurile unei liste date L.

Teoretic, ar trebui rezolvată cu funcții map. Practic, ... îmi dă o eroare dubioasă LISP, așa că deocamdată aici îi rezolvarea clasic, recursiv. Ideea îi că trebuie să unești în mod diferit procesarea (car l) cu procesarea restului listei, depinzând de faptul că începutul îi elementul căutat, un atom oarecare sau o listă.

(defun rep(el l l1)
    (cond
        ((null l) nil)
        ((and (atom (car l)) (= el (car l)))
            (append l1 (rep el (cdr l) l1)))
        ((atom (car l)) (cons (car l) (rep el (cdr l) l1)))
        (t (append (list (rep el (car l) l1)) (rep el (cdr l) l1)))
    )
)

Aștept requesturi în comentarii.