2016-04-11 11 views
0

Ich brauche eine Funktion in Lisp zu machen, die eine Liste wie folgt angezeigt:Funktion in Lisp, die eine Liste in einer bestimmten Art und Weise zeigt

(a b (c d) (e f g) h) -> 
(a 
b 
(c 
    d) 
(e 
    f 
    g) 
h) 

Bisher gelang es mir, eine Funktion zu machen, die eine Liste wie diese zeigt .

(defun print1-lista(l) 
    (princ pard) 
    (do ((lst l (cdr lst))) 
     ((null (cdr lst)) (princ (car lst)) (princ par)) 
    (princ (car lst)) 
    (terpri))) 

    PRINT1-LISTA 
    > (print1-lista '(1 (1 2) 3 4)) 
    {1 
    (1 2) 
    3 
    4} 
    } 
+0

Vielleicht möchten Sie Ihre Frage neu zu formatieren, es ist schwer zu sagen, was Sie genau wollen. Auch, was Lisp verwenden Sie? –

+0

Ich werde es sofort umformatieren. Ich benutze xlisp-stat –

+1

Sie müssen eine rekursive Funktion schreiben. Wenn das aktuelle Element eine Liste ist, muss es die Funktion erneut mit dem Inhalt aufrufen. Und die Funktion muss den Einrückungsbetrag als Parameter erhalten. – Barmar

Antwort

3

In Common Lisp können Sie den Drucker auf viele Arten anpassen. Zum Beispiel steuern die Variablen * print-case * und * print-margin-right * den Fall, in dem Symbole gedruckt werden, und den rechten Rand, wie er vom hübschen Drucker verwendet wird. So können Sie etwas tun:

(let ((*print-case* :downcase) 
     (*print-right-margin* 2)) 
    (pprint '(a b (c d) (e f g) h))) 

zur Ausgabe wie diese:

(a 
b 
(c 
    d) 
(e 
    f 
    g) 
h) 
1

Hier ist eine schnelle und schmutzige Skizze eines solchen Systems für ziemlich Druck in PLT-Scheme

(define (deep-ppr lst depth) 
    (let ((elt (car lst))) 
    (if (list? elt) 
     (begin 
      (printf "~a(~a\n" (make-string depth #\) (car elt)) 
      (deep-ppr (cdr elt) (+ 1 depth))) 
     ;; not a list 
     (begin 
      (printf "~a~a" (make-string depth #\) elt))) 
    (if (empty? (cdr lst)) (printf ")") 
     (begin 
      (printf "\n") 
      (deep-ppr (cdr lst) depth))))) 

Welche dies ergibt. Sie können das Schema für die Einführung von Zeilenumbrüchen beliebig ändern.

sicp.rkt> (deep-pp '(1 (1 2 4) 3 4 5 6 (1 2 3 5) 7) 0) 

(1 
(1 
    2 
    4) 
3 
4 
5 
6 
(1 
    2 
    3 
    5) 
7) 
+0

Ich bin neu bei xlisp stat und kämpfe immer noch um es zu verstehen, also plt-schema es ist ziemlich schwer für mich zu verstehen –

+0

Ich postete eine direkt rekursive Version, die sein könnte leichter für dich zu verstehen. –

+0

Ich habe das speziell für dich geschrieben - Das Mindeste, was du tun kannst, ist up & accept! –

Verwandte Themen