@@(lily)

Begonnen von erich, Mittwoch, 2. August 2017, 07:12

« vorheriges - nächstes »

erich

Hallo allen

Harm verwendet in einem Beitrag  https://lilypondforum.de/index.php/topic,98.0.html Codezeilen der Form

#(define string->string-list (@@ (lily) string->string-list))

Vielleicht kann uns Harm die programmiertechnische Bedeutung von @@(lily) erklären und wo wir dazu
Näheres erfahren können.

Gruß
Erich

Malte

Da hilft vermutlich als erste Anlaufstelle der entsprechende Abschnitt der Guile-1.8-Dokumentation weiter.

harm6

#2
In der von Malte verlinkten Stelle aus der guile-Doku kann man lesen:
Zitat von: guile-doc[...]This syntax is only intended for debugging purposes or as a last resort.
Man sollte das drastisch übersetzen:
"Scheiß drauf, ob das jetzt eine öffentliche oder interne Definition ist. Gibs mir und nerv mich nicht weiter."

Zur Illustration:
Zitat von: terminal
~$ lilypond scheme-sandbox
GNU LilyPond 2.18.2
Processing `/home/harm/lilypond/usr/share/lilypond/current/ly/scheme-sandbox.ly'
Parsing...
guile> string->string-list
ERROR: Unbound variable: string->string-list
ABORT: (unbound-variable)
guile> (@@ (lily) string->string-list)
#<procedure string->string-list (str)>
guile>

"lily" ist das module in dem sich die Definitionen befinden.
Um zu betrachten was sich dort befindet:
#(pretty-print (ly:module->alist (resolve-module '(lily))))
Aber Vorsicht, es ist eine riesige Liste.

(assoc-get 'string->string-list (ly:module->alist (resolve-module '(lily))))
führt dann zum selben Ergebnis wie
(@@ (lily) string->string-list)


In meinem coding hier:
https://lilypondforum.de/index.php/topic,98.msg607.html#msg607
habe ich zwei auch sonst öffentliche Funktionen neu definiert: bar-line::compound-bar-line und ly:bar-line::print.
Diese verwenden allerdings einige interne Funktionen, die in bar-line.scm vorkommen.
Das sourcefile zu verändern ist aus einer Reihe von Gründen keine gute Idee, auch wenn man dann direkten Zugriff auf die internen Funktionen hat.
Also tut man das in einem (möglicherweise zu inkludierenden) .ly oder .ily-file.
Orthodox wäre es, die benötigten interna aus bar-line.scm heraus zu kopieren und ins .ly oder .ily-file zu einzufügen. Hätte aber den Umfang des Codes deutlich aufgebläht.

Das ich das nicht gemacht habe ist einerseits Faulheit, andererseits hätte es den Blick auf die tatsächlichen Änderungen vernebelt.


Gruß,
  Harm




Malte

Wieder was gelernt, danke! Ich hätte sowas schon ein paar mal brauchen können ;)