Hallo Freunde,
ich möchte innerhalb einer Score-Definition Variablen nur verwenden, wenn sie definiert sind. Hier der (funktionierende) Code:
\version "2.19.64"
mymusic = { c'4
f' f' f'
f' g' a'
a' g' g'
g' r
}
myglobals = {
\time 3/4 \partial 4
\key f \major
}
\score { \new Staff <<
\mymusic
#(if (defined? (eval-string " 'myglobals"))
#{ \myglobals #})
>> }
Durch Auskommentieren der Variablen
myglobals lässt sich zeigen, dass diese auch optional ist. - Soweit, so gut!
Nun aber möchte ich die Variable, die ich einmal definiert hatte, im Verlauf wieder verschwinden lassen. Dazu zwei Versuche:
(1)
Ich setze zwischen die Definition von
myglobals und des Score:
Zitat#( undefine myglobals )
Dann erhalte ich allerdings die Meldung
"Some deprecated features have been used." - Das möchte ich in jedem Fall vermeiden, schon um kompatibel auch mit neueren Versionen zu bleiben. Frage: Gibt es eine akzeptierte Möglichkeit, die Definition eines Symbols rückgängig zu machen?
(2)
Mein zweiter Versuch:
In meinem Minimal-Beispiel ersetze ich die Score-Definition durch folgende:
\score { \new Staff <<
\mymusic
#(if (and (defined? (eval-string " 'myglobals")) (eval-string "'my-globals"))
#{ \myglobals #})
>> }
Hier wird also nach der Existenz des Symbols auch geprüft, ob dieses "wahr" ist.
Dann füge ich statt der
undefine-Anweisung Folgendes ein:
Zitatmyglobals = ##f
Leider gelingt das nicht stillschweigend; ich erhalte die Warnung:
"Nicht-musikalischer Ausdruck wird ignoriert", die ich ebenfalls gerne vermeiden möchte.
Tja! Und jetzt? Wie würdet ihr vorgehen?
Danke für Eure Hilfe,
--ingmar
Hallo ingmar,
ich verstehe weder diese Bedingung:
(and (defined? (eval-string " 'myglobals")) (eval-string "'my-globals"))
noch Deinen Kommentar:
"Hier wird also nach der Existenz des Symbols auch geprüft, ob dieses "wahr" ist."
eval-string angewendet auf einen string wie "' ... " retourniert immer ein symbol. Dieses symbol existiert also immer.
defined? angewendet auf dieses symbol prüft, ob es im aktuellen modul einen "Inhalt" gibt, der an dieses symbol gebunden ist, iirc.
Ein einzelnes symbol wie (eval-string "'my-globals") existiert also ("-" ist ein Tippfehler, nehm ich an), ist nicht false und deshalb immer true. Warum das also?
Aber zur eigentlichen Frage.
Versuchs mal mit :
myglobals = #*unspecified*
HTH,
Harm
Ja, du hast recht, da hatte mich der Tippfehler in die Irre geführt.
myglobals = #*unspecified* scheint in meinem Fall nicht wie gewünscht zu funktionieren, ich schau mir das später nochmal an. Erstmal Danke!
--ingmar
Zitatmyglobals = #*unspecified* scheint in meinem Fall nicht wie gewünscht zu funktionieren
Gibt's eine error- oder warning-message?
Dann vielleicht:
myglobals = #(empty-music)
*unspecified* kommt aus guile, empty-music ist eine ly-procedure, mit beiden Möglichkeiten bleibt 'myglobals' definiert gibt aber nichts sichtbares aus (auch wenn das "unsichtbare" gänzlich verschieden ist).
HTH,
Harm
ZitatHarms: mit beiden Möglichkeiten bleibt 'myglobals' definiert gibt aber nichts sichtbares aus
Danke! aber eben das reicht in meinem Fall nicht! Mein Minimalbeispiel war mal wieder zu einfach, um das Problem in voller Schönheit zu zeigen. Ich möchte wirklich die Definition wegschmeissen.
--ingmar
ZitatIch möchte wirklich die Definition wegschmeissen.
Da stellt sich natürlich die Frage warum so radikal?
Eventuel ginge dann:
\version "2.19.64"
mymusic = { c'4
f' f' f'
f' g' a'
a' g' g'
g' r
}
myglobals = {
\override NoteHead.color = #red
\time 3/4 \partial 4
\key f \major
}
\score {
\new Staff
<<
\mymusic
#(if (defined? (eval-string " 'myglobals"))
#{ \myglobals #})
>>
}
#(module-remove! (current-module) 'myglobals)
\score {
\new Staff
<<
\mymusic
#(if (defined? (eval-string " 'myglobals"))
#{ \myglobals #})
>>
}
Gruß,
Harm
Jau! Und so klappt auch!
Mir ist schon klar, dass das ein wenig radikal ist... die Scheme-Foren, in denen jemand nach sowas fragt, sind voll von Erklärungen, warum man das keinesfalls und nie und unter gar keinen Umständen braucht...
Danke trotzdem für die Hilfe! : - )
--ingmar
Zitatdie Scheme-Foren, in denen jemand nach sowas fragt, sind voll von Erklärungen, warum man das keinesfalls und nie und unter gar keinen Umständen brauch
In der Regel auch mit gutem Grund ;)
Warum brauchst Du es?
Gruß,
Harm
... weil so, wie ich es einsetze, schon ein Staff definiert ist; der würde dann halt leer gedruckt. Wahrscheinlich kann man das alles umbauen, es ist mir aber nicht so schnell gelungen, und wegen meiner notorischen Scheme-Schwäche würde es ganz sicher zuviel Zeit verspeisen. So wie jetzt scheint es mir erstmal am übersichtlichsten.
Danke nochmal, Gruß,
--ingmar