Variable setzen in function

Begonnen von Köbi, Mittwoch, 7. August 2019, 21:17

« vorheriges - nächstes »

Köbi

Um die Ferienflaute zu überbrücken ;-)

Warum funktioniert der folgende Code nicht?


\version "2.19.83"

FuncA =
#(define-void-function
  (aPar)
  (string?)
  #{
    newPar = #aPar
  #}
  )

\FuncA "par1"


Ich bekomme "error: not a note name: newPar"  :-(
Ich würde gerne in Lilypond-Syntax in der function eine Variable setzen.

Danke im voraus für eure Bemühungen!

harm6

#{ #} dient dazu Musik in guile einzubetten. Du versuchst dort eine Definition durchzuführen.
Kann nicht klappen, siehe:
#(display-scheme-music #{ #})
->
(make-music (quote Music))

Warum eigentlich in einer Funktion und nicht ganz simple toplevel?

Nichtsdestotrotz, so kann man es machen:
\version "2.19.83"

FuncA =
#(define-void-function (aPar) (string?)
  (module-define! (current-module) 'newPar aPar))

\FuncA "par1"

#(write newPar)


Ich halte aber nichts davon, möglicherweise änderte ich meine Meinung, wenn ich wüßte wofür Du's brauchst. ;)

Gruß,
  Harm

Köbi

Danke Harm. Ich war eigentlich an etwas anderem dran, das nicht funktionierte. Beim reduzieren auf ein Minimalbeispiel bin ich über das obige gestolpert und habe es deshalb als erstes gepostet.

Das Grundanliegen ist, dass ich Noten abhängig von einer Bedingung ausgeben möchte. Dazu nutze ich functions. Folgendes Minimalbeispiel funktioniert:


\version "2.19.83"

ScoreSetup =
#(define-void-function
  (aMusic)
  (ly:music?)
  (ly:parser-define! 'currentMusic aMusic)
  )


ScoreTwo =
#(define-scheme-function (aTempo) (string?)
   #{
     \score {
       \relative {
         \tempo #aTempo
         \currentMusic
       }
     }
   #}
   )

\ScoreSetup \relative { e' }
\ScoreTwo "Tempo1"


Die letzten zwei Zeilen sollen aber nur ausgeführt werden, wenn eine Bedingung erfüllt ist. Pseudocode:


xA = 0
xB = 0
#(if (equal? xA xB)
  #{
    \ScoreSetup \relative { e' }
    \ScoreTwo "Tempo1"
  #}
)


Wie mache ich das?

harm6

#3

\version "2.19.83"

ScoreSetup =
#(define-void-function (aMusic) (ly:music?)
  (ly:parser-define! 'currentMusic aMusic))

ScoreTwo =
#(define-scheme-function (aTempo) (string?)
   #{
     \score {
       \relative {
         \tempo #aTempo
         \currentMusic
       }
     }
   #})
%
%\ScoreSetup \relative { e' }
%\ScoreTwo "Tempo1"

xA = 0
xB = 0

%% needs to be here to signal the definition of `xB´ is finished
%% (other "fillers" are possible as well)
#(list)
$(if (equal? xA xB)
     (begin
      (ScoreSetup #{ \relative { e' } #})
      #{
        \ScoreTwo "Tempo1"
      #}))


funktioniert hier.

Gruß,
  Harm

EDIT code korrigiert

Köbi