Deutsches Lilypond Forum (Archiv)

Allgemein => Fragen zu Funktionen => Thema gestartet von: ingmar am Freitag, 8. Mai 2015, 21:54

Titel: \include im includierten File feststellen (GELÖST)
Beitrag von: ingmar am Freitag, 8. Mai 2015, 21:54
hallo,

ich möchte per \include ein File QUELLE in ein anderes File PARTITUR einbinden. QUELLE enthält im Prinzip die Noten, PARTITUR kümmert sich um deren Darstellung. Es gibt nun Details, die ich nicht in PARTITUR schreiben kann, da sie bei jeder einzelnen Note stehen müssen (Beispiel: Fingersätze, und ich will eine Partitur mit, eine andere ohne Fingersätze erzeugen können). Daher möchte ich in PARTITUR eine Variable setzten, die anschließend in QUELLE ausgewertet wird.

Problem: Wenn ich QUELLE kompiliere, ist diese Variable natürlich undefiniert. Das ist schlecht, denn so kann ich bei Änderungen nicht so ohne weiteres die syntaktische Richtigkeit von QUELLE prüfen. Also möchte ich diese Variable gegebenenfalls mit einem Defaultwert setzen.

Dazu müsste ich innerhalb von QUELLE prüfen können,
* ob die Variable existiert
* oder ob das File über \include eingebunden wurde.

Gibt es da eine schlichte Möglichkeit?

Ich kann keinen lauffähigen Code liefern, aber vielleicht reicht das Folgende:
 
===PARTITUR.ly===
\version "2.18.2"
condition = "irgendwas"
\include QUELLE.ly
...

===QUELLE.ly===
\version "2.18.2"
\relative { c d e f
#(if condition ; ...und condition ist eben nicht gesetzt, wenn QUELLE selbst kompiliert wird.
#{ RESULT = \relative {c d e f } #}
#{ RESULT = \relative { g a b2 } #})
}

Ich hatte es mal mit #(if defined? \condition) versucht, aber auch da gibts vom Compiler nur die Klage, \condition sei "unbound", also nicht bekannt..

tja. Gibt bestimmt ne ganz simple Lösung...? : - )
--ingmar
Titel: Re: \include im includierten File feststellen
Beitrag von: harm6 am Freitag, 8. Mai 2015, 23:18
Hallo Ingmar,

sieht nach einem Syntax-Problem aus.

Hilft
\version "2.18.2"

%% Try comment/uncomment:
%condition = "irgendwas"

\relative {
  c d e f
  #(if (defined? 'condition)
    #{ c d e f #}
    #{ cis dis eis fis #})
}
?


Gruß,
  Harm
Titel: re: \include im includierten File feststellen
Beitrag von: ingmar am Samstag, 9. Mai 2015, 09:02
Danke. Ja - das hilft.

Aber im Versuch, minimal zu sein, zeigte mein Beispiel nicht alles. Ich muss eine Variable setzen.

\version "2.18.2"

% Try comment/uncomment:
ST = "irgendwas"

#(if (defined? 'ST)
    #{    #}
    #{ ST = "was anderes" #})

\relative {
  c d e f
g^\ST a b c
}

..aber das funktioniert leider nicht, wenn oben einkommentiert wird; der Compiler erwartet offenbar an dieser Stelle keine Variablendefinition.

Eleganter fände ich übrigens auch folgendes - weiß nicht, ob das so geht:

\version "2.18.2"

% Try comment/uncomment:
 ST = "irgendwas"


  #(unless (defined? 'ST)
    #{ ST = "was anderes" #})


\relative {
  c d e f
  g^\ST a b c
}

Danke im Voraus... : - )
--ingmar
Titel: Re: \include im includierten File feststellen
Beitrag von: harm6 am Samstag, 9. Mai 2015, 12:42
Dein Beispiel läßt sich so umsetzen

\version "2.18.2"

% Try comment/uncomment:
ST = "irgendwas"

#(if (defined? 'ST)
     ST
     (define ST "was anderes" ))

\relative {
  c d e f
g^\ST a b c
}


oder so

\version "2.18.2"

% Try comment/uncomment:
ST = "irgendwas"

#(define ST
  (if (defined? 'ST)
      ST
      "was anderes"))
     
\relative {
  c d e f
g^\ST a b c
}

HTH,
  Harm
Titel: Re: \include im includierten File feststellen
Beitrag von: ingmar am Samstag, 9. Mai 2015, 19:18
Hallo,

die zweite Lösung kann ich nachvollziehen, bei der ersten hab ich Schwierigkeiten:
#(if (defined? 'ST)
     ST
     (define ST "was anderes" ))

Wir prüfen, ob ST definiert ist. Ist es das nicht, definieren wir es als "was anderes". Ist es aber definiert - tja, dann müssten wir doch eigentlich gar nichts tun! Was macht die Zeile "ST" in diesem Fall? *kopfschüttel*

Gruß,
--ingmar
Titel: Re: \include im includierten File feststellen (GELÖST)
Beitrag von: harm6 am Samstag, 9. Mai 2015, 20:47
Zitat
#(if (defined? 'ST)
     ST
     (define ST "was anderes" ))

Wir prüfen, ob ST definiert ist. Ist es das nicht, definieren wir es als "was anderes". Ist es aber definiert - tja, dann müssten wir doch eigentlich gar nichts tun!

Absolut richtig.

Zitat
Was macht die Zeile "ST" in diesem Fall? *kopfschüttel*

Nichts sinnvolles.

Insoweit:

\version "2.18.2"

% Try comment/uncomment:
%ST = "irgendwas"

#(if (not (defined? 'ST))
     (define ST "was anderes" ))

     
\relative {
  c d e f
g^\ST a b c
}

Falls 'ST' definiert ist gibts als Ausgabe "unspecified",
Zitat
guile> (define ST "irgendwas")
guile> (display (if (not (defined? 'ST))
     (define ST "was anderes" )))
#<unspecified>

was hier völlig unproblematisch ist.

Insoweit war mein Vorschlag durchaus verbesserungswürdig !


Gruß,
  Harm
Titel: re: \include im includierten File feststellen (GELÖST)
Beitrag von: ingmar am Sonntag, 10. Mai 2015, 09:51
...dann ist also Guile/Scheme am Ende doch etwas, was der menschliche Geist, genügend Training vorausgesetzt, auch ohne Bezug zur Esoterik kapieren kann! Für mich ein Grund, nicht aufzugeben...

Gruß,
--ingmar
Titel: Re: \include im includierten File feststellen (GELÖST)
Beitrag von: harm6 am Dienstag, 12. Mai 2015, 00:20
Zitat
...dann ist also Guile/Scheme am Ende doch etwas, was der menschliche Geist, genügend Training vorausgesetzt, auch ohne Bezug zur Esoterik kapieren kann!

Ehrlich gesagt habe ich keine Ahnung, warum scheme von vielen so betrachtet wird, gerade von Leuten mit Erfahrung in anderen Programmiersprachen...

Zitat
Für mich ein Grund, nicht aufzugeben...
:D


Grüße,
  Harm
Titel: Re: \include im includierten File feststellen (GELÖST)
Beitrag von: mgd am Freitag, 22. Mai 2015, 14:42
Zitat
Zitat

    ...dann ist also Guile/Scheme am Ende doch etwas, was der menschliche Geist, genügend Training vorausgesetzt, auch ohne Bezug zur Esoterik kapieren kann!


Ehrlich gesagt habe ich keine Ahnung, warum scheme von vielen so betrachtet wird, gerade von Leuten mit Erfahrung in anderen Programmiersprachen...

Ich versuche mich mal an einer Erklärung. Es gibt m.E. mehrere Gründe (gibt es ja eigentlich immer ;) )

Um ja nicht falsch verstanden zu werden:
Das ist nicht als Bashing gemeint. Ich bin sehr angetan von der durchgängigen Freundlichkeit und Hilfsbereitschaft in der Lilypond Community (jedenfalls soweit ich sie bisher habe kennenlernen können). Obige Punkte sind einfach die Stellen, an denen ich selbst mich abgearbeitet habe. Ich gehöre zu den Leuten mit Erfahrung in anderen Programmiersprachen (incl. ein wenig elisp).

Liebe Grüße,
Michael
Titel: Re: \include im includierten File feststellen (GELÖST)
Beitrag von: ingmar am Freitag, 22. Mai 2015, 19:07
Zitat
Ich versuche mich mal an einer Erklärung.
ich würde aber doch vorschlagen, dafür einen eignen Thread aufzumachen - so findet das irgendwann niemand mehr! : - )

--ingmar
Titel: Re: \include im includierten File feststellen (GELÖST)
Beitrag von: ingmar am Mittwoch, 18. November 2015, 14:46
Schade, dass die Diskussion über Scheme und wie man dahintersteigt nicht weiterging..

..unabhängig davon:

ich hab ein Problem, wenn die Variable nicht einfach ein String ist. Im folgenden Beispiel soll sie Markup-Code sein; ähnlich ist denkbar, dass es sich um eine Folge von Noten handelt:

\version "2.18.2"

DEFAULT-MARKUP = \markup \with-color #(x11-color 'grey45) {
\fontsize #1
\override #'(font-name . "Courier" )
\bold
"Überschrift"
}

#(if (not (defined? 'TITLE ))
     ( #{ TITLE = \DEFAULT-MARKUP #} ))

\TITLE


Der Compiler beschwert sich, weil ich in der Scheme-Passage ein Gleichheitszeichen verwende; nach meinem Verständnis kann ich aber doch per #{ ... #} LilyPond-Code einbinden, oder?

Gruß, danke,
--ingmar

Titel: Re: \include im includierten File feststellen (GELÖST)
Beitrag von: fugenkomponist am Mittwoch, 18. November 2015, 21:11
Der Compiler beschwert sich, weil ich in der Scheme-Passage ein Gleichheitszeichen verwende; nach meinem Verständnis kann ich aber doch per #{ ... #} LilyPond-Code einbinden, oder?
Ich bin mir nicht 100% sicher, aber: Nein, nicht beliebigen LilyPond-Code. Sondern Musik-Ausdrücke. „c“ ist einer. „{ c }“ ist einer „<< \new Staff { c } \new Staff { d e } >>“ ist einer. Die rechte Seite einer Zuweisung ist einer. Aber die Zuweisung selbst nicht.

Du kannst das ganze aber einfach direkt in Scheme machen:#(if (not (defined? 'TITLE ))
     (define TITLE DEFAULT-MARKUP))
Titel: Re: \include im includierten File feststellen (GELÖST)
Beitrag von: ingmar am Donnerstag, 19. November 2015, 13:49
Zitat
Du kannst das ganze aber einfach direkt in Scheme machen:#(if (not (defined? 'TITLE ))
     (define TITLE DEFAULT-MARKUP))
Ja, so funktioniert's - danke!

--ingmar