2016-10-08 3 views
0

Ich versuche, Deep-Reverse-Funktion in Lisp zu machen. Zum Beispiel:So machen Sie die Deep-Reverse-Funktion in Lisp

(a (b c d) e) -> (e (d c b) a)  

Hier ist mein Code.

(defun deeprev (l) 
    (cond ((null l) nil) 
     ((list (car l)) (append (deeprev (cdr l)) (deeprev (car l)))) 
     (t (append (deeprev (cdr l))(car l))) 
) 
) 

Immer, wenn ich kompilieren und Last, habe ich einen Fehler:

Error: Attempt to take the car of E which is not listp

+0

http://stackoverflow.com/q/8797601/124319 – coredump

+0

http://Stackoverflow.com/q/4102996/124319 – coredump

Antwort

4

Die einfachste Möglichkeit, nur REVERSE die aktuelle Liste sein würde, und verwenden Sie MAPCAR alle sublist mit der gleichen Funktion zu umkehren.

(defun tree-reverse (tree) 
    "Deep reverse TREE if it's a list. If it's an atom, return as is." 
    (if (listp tree) 
     (mapcar #'tree-reverse 
       (reverse tree)) 
     tree)) 

(tree-reverse '(a (b c d) e)) ;=> (E (D C B) A) 
3

In Ihrer Funktion übernehmen Sie, dass, wenn die l Eingangsgröße nicht nil ist, dann ist es unbedingt ein Wider-Zelle ist, weil Sie bedingungslos (car l) innerhalb der Funktion (list ...) nimmt. Deshalb haben Sie einen Fehler. Es gibt viele andere Dinge, die nicht zu diesem Zeitpunkt an lnil gebunden sein können, wie Zahlen oder Symbole.

Übrigens, (list ...) baut nur eine Liste, Sie müssten statt dessen listp verwenden. Da Sie den nil Fall ausgeschlossen haben und eine Liste entweder als nil oder als cons definiert ist, hätten Sie auch consp verwenden können.

+0

Vielen Dank !! Aber ich kann nicht reparieren (Liste (Auto l)) Teil ... :( –

Verwandte Themen