Variablendefinitionen verschwinden lassen [GELÖST]

Begonnen von ingmar, Sonntag, 25. November 2018, 05:59

« vorheriges - nächstes »

ingmar

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

harm6

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


ingmar

#2
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

harm6

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

ingmar

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

harm6

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

ingmar

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

harm6

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

ingmar

... 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