#(if (not (defined? 'rName)) (define rName cScoreA)) -> funktioniert nicht mehr

Begonnen von Köbi, Mittwoch, 17. August 2022, 20:17

« vorheriges - nächstes »

Köbi

Hallo zusammen

In einem Projekt mit Version 2.19.83 habe ich folgenden Code, der funktioniert:
cScoreA = "cScoreA"
#(if (not (defined? 'rName)) (define rName cScoreA))

Nun habe ich auf Version 2.23.10 gewchselt und bekomme folgenden Fehler:
error: GUILE signaled an error for the expression beginning here
#
 (if (not (defined? 'rName)) (define rName cScoreA))

Hat sich da etwas geändert? Wie finde ich heraus, wie ich das neu machen muss?

harm6

cScoreA = "cScoreA"

#(define rName
  (if (not (defined? 'rName))
      cScoreA
      rName))

In allen neueren Versionen wird guile-2.2 verwendet. Mit dieser guile-Version ist (define ...) innerhalb einer if-Verzweigung nicht mehr machbar.

Gruß,
  Harm

Köbi

Danke für die Aufklärung, Harm!

Nun habe ich noch eine nSpezialfall: Wie stelle ich diesen Code um?
% if necessary initialize treeContainer
#(if (not (defined? 'treeContainer)) (define treeContainer '()))

% functions to store values in the tree
putMusic =
#(define-void-function (parser location path content)(string? ly:music?)
   (let ((pl (string->path path)))
     (set! treeContainer (tree-set! treeContainer pl content))
     ))

Das Initalisieren des treeContainer schaffe ich nicht :-(

harm6

Das scheint code von Jan-Peter zu sein. Mittlerweile in https://github.com/openlilylib
Da Urs inaktiv geworden ist lag es eine zeitlang brach, aber mittlerweile hat Andrew sich der Sache angenommen. Wie ich hörte soll openlilylib jetzt mit den neuesten LilyPond-Versionen wieder funktionieren.

Falls es sich wirklich um diesen Code handelt so würde ich Dir raten openlilylib auf den neuesten Stand zu bringen und zu testen.

Falls nicht melde Dich noch mal.

Gruß,
  Harm

Köbi

Die Idee dahinter dürfte ähnlich sein wie openlilylib, aber ich arbeite nicht mit openlilylib. Das Problem dürfte nur das '() sein. Wie initialisiere ich mit der neuen Syntax diese Variable?

harm6

ZitatWie initialisiere ich mit der neuen Syntax diese Variable?
Eigentlich handelt es sich nicht um neue Syntax. Vielmehr ist manches aus guile-1 nicht mehr erlaubt, allerdings funktioniert die Schreibweise, die für guile-2 nötig wird auch in guile-1.

Es sollte also gehen wie in dem anderen Beispiel:
#(define treeContainer
  (if (not (defined? 'treeContainer))
      '()
      treeContainer))
oder mit positiv Logik:
#(define treeContainer
  (if (defined? 'treeContainer)
      treeContainer
      '()))

Gruß,
  Harm

Köbi

Stimmt, funktioniert (ich anscheinend etwas falsch ausprobiert, sorry)

Vielen Dank Harm für deinen tollen Service :-)

harm6

Hey, ich leiste keinen Service!!
Tatsächlich wäre der beste Dank (der auch noch Dich selbst weiter bringt), wenn Du Fragen beantworten würdest!
Das gilt natürlich für alle Mitglieder dieses Forums.

Gruß,
  Harm