Deutsches Lilypond Forum (Archiv)
Allgemein => Hilfe beim Einstieg in Lilypond => Thema gestartet von: ingmar am Sonntag, 16. August 2015, 13:19
-
hallo,
ich versuche, etwas in Guile zu definieren bzw zu berechnen, krieg aber offenbar keinen Wert zurück.
Mein Minimalbeispiel:
\version "2.18.2"
#( define ( Increm a )
( + a 1 )
)
\markup { #Increm 9 }
\markup { #( Increm 3 ) }
Leider sehe ich nur den Wert 9, beim zweiten Markup gar nichts, das scheint trotz gleicher Fehlermeldung noch falscher zu sein! Im Log steht lapidar "Keine Textbeschriftung". Was mache ich falsch?
Danke, Gruß,
ingmar
-
Das Problem ist, dass \markup anscheinend nicht einfach Zahlen ausgeben kann.
\markup 9gibt den String „9“ aus, es hat den gleichen Effekt wie
\markup "9"Man könnte folgendermaßen erzwingen, dass die 9 als Zahl-Datentyp in Scheme interpretiert wird:
\markup #9Und schon hat man den gleichen Fehler „not a markup“. Ein Scheme-String geht dagegen:
\markup #"9"
Also gehen auch Sachen wie
\markup #(1+ 9)nicht, wohl aber
\markup #(number->string (1+ 9))Die Lösung für dein Problem sieht also folgendermaßen aus:
#(define (inc a)
(number->string (1+ a)))
\markup #(inc 9)
Edit: Übrigens ist dein erster Versuch mit der Ausgabe 9 so gesehen „falscher“ als der zweite. Denn auch die Funktion Increm ist eben eine Funktion und kein String und kann deshalb nicht einfach ausgegeben werden. Die 9 danach wird als String interpretiert und deshalb ausgegeben. Erst die Klammern in deinem zweiten Versuch führen dazu, dass die Funktion auf die Zahl angewendet wird, diese Version ist also eher das, was du eigentlich wolltest ;)
2. Edit: Es gibt auch noch Funktionen ly:message und display und write (letztere unterscheiden sich ein bisschen, tun aber in diesem Fall fast das gleiche), die für Ausgaben im Terminal während des Übersetzens gedacht sind:
\version "2.19.25"
#(define (inc a)
(ly:message "Unsere neue Zahl ist ~a" (1+ a)))
#(inc 5)
#(define (inc a)
(begin
(display "Und hier geb ich noch mal was aus\n")
(display (1+ a))
(newline)))
#(inc 8)
\markup "Das hier landet als einziges in der Partitur"
-
oh, sehr hilfreich. Mit (number->string ...) klappt es tatsächlich.
Ich hab eigentlich auch nur ein paar Stringmanipulationen vor; Zahlen hatte ich nur benutzt in dem Glauben, ein einfacheres Minimalbeispiel liefern zu können.
Hier sieht man, dass es mit Strings gut funktioniert:
KOMPONIST = "Wolfgang Amadeus Mozart"
\markup { #( string-downcase KOMPONIST ) }
Ja, danke, dann werd ich mal weiter probieren..
Gruß,
--ingmar
-
Hallo,
alles richtig was fugenkomponist sagt.
Wenn Du Dich ernsthafter mit guile beschäftigst, laß mich noch hinzufügen, daß es Konventionen gibt wie der Code geschrieben wird, um es allen einfacher zu machen sich in einem gegebenen code-snippet zurecht zu finden.
Siehe:
http://community.schemewiki.org/?scheme-style (http://community.schemewiki.org/?scheme-style)
Ist auch im Contributors Guide erwähnt.
Deine procedure sollte eher so aussehen:
#(define (increm a)
(+ a 1))
oder der Kürze wegen auch
#(define (increm a) (+ a 1))
Gruß,
Harm