Autor Thema: Ausgabe in gesonderte Datei  (Gelesen 2237 mal)

erich

  • Member
Ausgabe in gesonderte Datei
« am: Donnerstag, 3. April 2014, 14:09 »
Hallo Lillies und andere;

ich wüsste gerne, ob und wie man Daten bei der Analyse mit Hilfe von Lilypond in eine gesonderte Datei ausgibt. Mit write geht alles in den Standartoutput; ich möchte aber bestimmte Daten gezielt in eine gesonderte Datei ausgeben können. Geht das übergaupt? Ich habe dazu nichts gefunden.

Vielen Dank fürs Nachdenken und Antworten
Erich

harm6

  • Member
Re: Ausgabe in gesonderte Datei
« Antwort #1 am: Freitag, 4. April 2014, 01:47 »
Hallo Erich,

LilyPond hat zwar einige display procedures, aber Deine Frage zielt ja auf die scheme-procedure write ab.
Und ich denke Du meinst nicht die Möglichkeiten, die man im Terminal hat den output auszugeben!?

Tatsächlich hat write (wie auch display und andere) ein optionales Argument mit dem man den output "umleiten" kann.

Ich habe es jetzt so gemacht, daß ich eine verallgemeinerte Definition geschrieben habe, die man benutzen kann, um eigene Ausgabe-funktionen zu erstellen.

Kommentare und Beispiel im Code.
Das file log.txt aus dem Beispiel wird (falls noch nicht vorhanden) in dem Ordner erschaffen in dem Du Dich gerade befindest.
Das Ganze ist so gesetzt, daß es aus einem LilyPond-file heraus funktioniert.
Wenn etwas unklar ist melde Dich.

#(define* ((my-write #:optional (port (current-output-port))
                                (option "a") ;; or "w"
                                (write-proc display))
                     arg)
;; my-write is meant as a general custom-definition of write/display etc
;; to make other custom-definitions possible quite easily
;;
;; optional arguments are
;; port       - defaults to the terminal on most systems
;;                   can be set to a file-name-string
;;      option     - default "a" means the output is appended
;;      "w" means the file content will be overriden
;;                   Only used if port is not the default
;;      write-proc - defaults to display
;;      other possible settings are write or
;;      pretty-print (with the need use the relevant modules)
;;
;; (my-write) without any specification is pretty much the same as display with
;; an added (newline)
                 
  (let* ((port (if (eq? (current-output-port) port)
                   port
                   (open-file port option))))
    (write-proc arg port)
    (newline port)
    (if (not (eq? (current-output-port) port))
        (close port))))
       
%% Example-definition:
% Need to set the following to make pretty-print possible
#(use-modules (ice-9 pretty-print))

#(define (write-to-log arg)
((my-write "log.txt" "a" pretty-print) arg))

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% EXAMPLES
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

#(write-to-log  "blabla")

%#(write-to-log all-user-grob-properties)

HTH,
  Harm
« Letzte Änderung: Freitag, 4. April 2014, 01:50 von harm6 »

erich

  • Member
Re: Ausgabe in gesonderte Datei
« Antwort #2 am: Freitag, 4. April 2014, 07:32 »
Hallo Harm,

ich hatte zunächst Dein Programm in frescobaldi aufgerufen und fand die log-Datei nicht, merkte dann aber, dass ich das Programm hätte abspeichern müssen, und fand dann auch die log-Datei und die vom ersten Versuch im /tmp-Ordner.
So hab ich wieder etwas dazugelernt.

Vielen Dank!
Erich

p.s. Ich arbeite nur unter Linux

erich

  • Member
Re: Ausgabe in gesonderte Datei
« Antwort #3 am: Freitag, 4. April 2014, 11:04 »
Hallo Harm,

ich habe noch eine Frage:
kann ich in

Zitat
#(define (write-to-log arg)
((my-write "log.txt" "a" pretty-print) arg))

das "log.txt" in einer Umgebungsvariablen oder in einer ähnlichen Form vereinbaren?

Gruß Erich

harm6

  • Member
Re: Ausgabe in gesonderte Datei
« Antwort #4 am: Freitag, 4. April 2014, 12:19 »
Nur ganz kurz, hab' im Moment keine Zeit.
Was meinst Du mit "log.txt in einer Umgebungsvariablen"?
Bzw, was möchtest Du erreichen?
Das hab ich noch nicht verstanden.

Gruß,
  Harm

erich

  • Member
Re: Ausgabe in gesonderte Datei
« Antwort #5 am: Freitag, 4. April 2014, 17:03 »
Hallo Harm

ich möchte für die Ausgabedatei eine Variable setzen können. Wenn die Noten in einer Datei stehen beispielsweise noten.ly und auf die Noten durch \notenDown zugegriffen werden kann und wenn die Prozedur, die auf alle Musik-objekte angewandt werden soll, \app heißt, dann wäre es schön, wenn man einen Aufruf der Form
{\app \notenDown} erweitern könnte; entweder in der Form {\(app log.txt) \notenDown} - wenn das mit einem lambda-Aufruf gelingt (mir ist es nicht gelungen), oder wenn man die log.txt-datei über eine Umgebungsvariable, beispielsweise  LOG, der man den Wert "log.txt" oder einen anderen zuweist, erreichen kann. Ich möchte die ganze Maschinerie verstecken können.

Gruß
Erich