Listen speichern und LOADen

Nov 11, 2008

Listen speichern und LOADen

Codes (formatiert) in LISP-Datei


Folgendes Problem: Fast jedes Programm sollte Benutzereinstellungen speichern. Wird das Programm wieder verwendet sind die zuletzt verwendeten Einstellungen die Vorgabeeinstellung.

Als Beispiel nehmen wir ein Programm KoordEin, welches Koordinaten aus einer Datei lesen soll. Die Benutzereinstellungen zu dem Programm werden unter c:\temp\KOORDEIN_USER.lsp gespeichert. D.h., wenn das Programm das erste mal aufstartet wird nach der Datei KOORDEIN_USER.lsp gesucht, wenn sie nicht gefunden wird, muss eine Liste mit Vorgabeeinstellungen erzeugt werden.

(if (not (findfile c:\temp\KOORDEIN_USER.lsp"))
(setq UserListe '((1 . "");;;Leereintrag für die erste Dateiauswahl
))
(setq UserListe (load "c:\temp\KOORDEIN_USER.lsp"))
)


In der UserListe werden Dottet Pair’s verwendet, damit auf die einzelnen Listeneinträge mit der Funktion ASSOC zugegriffen werden kann. So ist z.B. der Dateipfad:

(setq Pfad (cdr(assoc 1 UserListe)))

Im Programm geht es weiter mit der Dateiauswahl, es wird die Datei c:\temp\koord.txt ausgewählt. Über die Funktion SUBST wird die UserListe mit dem neuen Dateipfad aktualisiert.

(setq UserListe (subst (cons 1 pfad)(assoc 1 UserListe)UserListe)

Jetzt ist der zuletzt verwendete Pfad in der UserListe gespeichert. Bevor das Programm jetzt aber beendet wird, muss diese Liste in die Datei c:\temp\KOORDEIN_USER.lsp gesichert werden. Das geschieht mit der selbstgeschriebenen Funktion KoordEin:UserListe:Write.

(defun KoordEin:UserListe:Write (UserListe Pfad / Datei)
(setq Datei (open Pfad "w"))
(write-line "'(" Datei)
(mapcar '(lambda (A)
(prin1 A Datei))
UserListe)
(write-line ")" Datei)
(close Datei)
)

Dabei wird  in die erste Zeile eine apostophierte, öffnende Klammer vorangestellt, dann die UserListe mit der Funktion PRIN1 in einer MAPCAR-Schleife geschrieben (es sind in der Regel mehr Werte als nur ein Dateipfad zu speichern, daher die Schleife), zum Schluß wird eine schließende Klammer geschrieben. Als Ergebnis liegt jetzt eine LSP-Datei im Listenformat vor, die mit der Funktion LOAD geladen werden kann. Das Programm könnte dann wie folgt aufgebaut sein:

(defun c:KoordEin ( / Pfad UserListe)
(if (not (findfile "c:\temp\KOORDEIN_USER.lsp"))
(setq UserListe '((1 . "") ;;;Leereintrag für die erste Dateiauswahl ))
(setq UserListe (load "c:\temp\KOORDEIN_USER.lsp"))
)
(if (setq Pfad (getfiled "Koordinatendatei wählen:"
(cdr (assoc 1 UserListe)) "*" 4))
(progn
(setq UserListe (subst (cons 1 Pfad) (assoc 1 UserListe) UserListe))
(BearbeiteDieKoordinaten Pfad)
(KoordEin:UserListe:Write UserListe "c:\temp\KOORDEIN_USER.lsp"))
))


Andere Neuigkeiten

Um unsere Webseite für Sie optimal zu gestalten und fortlaufend verbessern zu können, verwenden wir Cookies. Durch die weitere Nutzung der Webseite stimmen Sie der Verwendung von Cookies zu.