Automatisches Include aller Dateien eines Ordners Sortierreihenfolge ändern wie?

Begonnen von Manuela, Donnerstag, 11. Januar 2018, 19:46

« vorheriges - nächstes »

Manuela

Hi,

dieser Code fügt automatisch alle Dateien eines Unterordners als \include ein:

\version "2.19.80"

loadFiles =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "ly" entry)
           (ly:parser-include-string
            (string-append
             "\\include \"" dir-name "/" entry "\""))))
     (closedir dir)))


Es scheint, dass die Reihenfolge umgedreht wird. Wie muss ich den Code ändern, damit die alphabetische Reihenfolge erhalten bleibt?

Vermutlich nur eine Scheme-Anweisung, leider habe ich schon länger nichts mehr in Scheme gemacht.
Danke für eure Hilfe
viele Grüße
-- Manuela

Be-3

Hallo Manuela,

die umgedrehte Reihenfolge liegt an ly:parser-include-string: der String wird quasi immer hinter die aktuelle "Cursorposition" geschrieben, so daß die eigentliche Reihenfolge genau umgekehrt ist, als man denken würde.

Als schnelle Lösung habe ich die Verzeichnis-Einträge zuerst in der Liste files gesammelt (schon gleich rückwärts) und erst am Ende und nach dem closedir die Einträge per ly:parser-include-string an den Parser übergeben.


\version "2.19.80"

loadFiles =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (string-suffix? "ly" entry)
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 (ly:parser-include-string
                  (string-append
                   "\\include \"" dir-name "/" entry "\"")))
       files)))



Viele Grüße
Torsten

Manuela

Danke für eure Hilfe
viele Grüße
-- Manuela

Manuela

Ich habe den Scheme-Code ein wenig adaptiert, sodass alle Dateien, die im Namen den Text "foo" und "bar" enthalten, nicht inkludiert werden. Für den Fall, dass man bestimmte Dateien ausschließen will.

loadFiles =
#(define-void-function (dir-name) (string?)
   (let ((dir (opendir dir-name))
         (files (list)))
     (do ((entry (readdir dir) (readdir dir)))
       ((eof-object? entry))
       (if (and (string-suffix? "ly" entry) (not (string-match "foo" entry)) (not (string-match "bar" entry)))
           (set! files (append (list entry) files))))
     (closedir dir)
     (for-each (lambda (entry)
                 (ly:parser-include-string
                  (string-append
                   "\\include \"" dir-name "/" entry "\"")))
       files)))

\loadFiles "...Unterverzeichnisname..."
Danke für eure Hilfe
viele Grüße
-- Manuela