Me doy cuenta de que este es un hilo viejo, pero es uno de los primeros que aparece cuando google lisp aplana. La solución que descubrí es similar a las discutidas anteriormente, pero el formato es ligeramente diferente. Lo explicaré como si fuera nuevo en lisp, como lo era cuando primero busqué en Google esta pregunta, por lo que es probable que otros también lo hagan.
(defun flatten (L)
"Converts a list to single level."
(if (null L)
nil
(if (atom (first L))
(cons (first L) (flatten (rest L)))
(append (flatten (first L)) (flatten (rest L))))))
Para los nuevos en lisp, este es un breve resumen.
La siguiente línea declara una función llamada a aplanar con el argumento L.
(defun flatten (L)
La línea debajo de cheques por una lista vacía.
(if (null L)
La siguiente línea devuelve nil porque contras ATOM nula declara una lista con una entrada (Atom). Este es el caso base de la recursión y le permite a la función saber cuándo detenerse. La línea después de esto comprueba si el primer elemento en la lista es un átomo en lugar de otra lista.
(if (atom (first L))
Entonces, si lo es, que utiliza recursión para crear una lista aplanado de este átomo combinado con el resto de la lista aplanada que la función va a generar. cons combina un átomo con otra lista.
(cons (first L) (flatten (rest L)))
Si no es un átomo, entonces tenemos que acoplar en él, porque es otra lista que puede tener otras listas dentro de ella.
(append (flatten (first L)) (flatten (rest L))))))
La función de agregar adjuntará la primera lista al inicio de la segunda lista. También tenga en cuenta que cada vez que utiliza una función en lisp, debe rodearla con paréntesis. Esto me confundió al principio.
No quita los paréntesis. Los paréntesis son solo un aspecto de una representación impresa para listas. Lo que estás haciendo es aplanar listas. – Svante