2017-06-14 2 views
0

le problème est: J'ai une liste de listes de listes comme ceci:écrire dans le fichier Common Lisp

(((1 2) (3 4) (5 6)) ((7 8) (9 0))) 

je l'ai d'écrire dans un fichier, où le nombre dans chaque liste de listes sont imprimées en ligne comme celui-ci:

....... 
1 2 3 4 5 6 
7 8 9 0 
...... 

...... signifie que je peux avoir plus la liste des listes. Je me demande comment je peux implémenter ceci sans utiliser la boucle et en utilisant with-open-file, format et récursion. entre chaque nombre il y a un espace ou un onglet et chaque liste de sous-liste commence une nouvelle ligne. Merci

EDIT:

J'ai réussi à imprimer une sous-liste de (a b) sur la même ligne avec ce code:

(defun write_pfs (filename point) 
    (with-open-file (str filename 
         :direction :output 
         :if-exists :append 
         :if-does-not-exist :create) 
    (format str (format nil "~~{~~a~~^~C~~}~T" #\Tab) point))) 


(defun write_points (filename points) 
    (mapcar #'(lambda (x) (write_point filename x)) points)) 

mais je n'ai aucun moyen d'imprimer chaque sous-liste de (((a b) (b c)) ((c d) (d e))) à une ligne différente.

+1

Qu'avez-vous essayé jusqu'à présent? – Renzo

Répondre

2

J'imagine que vous pouvez faire une fonction d'aide en utilisant labels à l'intérieur du corps de with-open-file de sorte qu'il a accès au flux.

(with-open-file (stream path :direction :output) 
    (labels ((recursive-print (lst) 
      ...) 
      (flatten (lst acc) 
      ...) 
      ...) 
    (recursive-print lst)))) 

Depuis cela ressemble à des devoirs que je ne développerai pas plus, mais faire plusieurs fonctions avec des étiquettes qui fait des choses différentes, comme flatten, print-lines et print-elements rend le code plus facile à lire et à modifier.