Autor Thema: @@(lily)  (Gelesen 1676 mal)

erich

  • Full Member
  • ***
  • Beiträge: 189
@@(lily)
« am: Mittwoch, 2. August 2017, 07:12 »
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

  • Hero Member
  • *****
  • Beiträge: 544
Antw: @@(lily)
« Antwort #1 am: Mittwoch, 2. August 2017, 09:08 »
Da hilft vermutlich als erste Anlaufstelle der entsprechende Abschnitt der Guile-1.8-Dokumentation weiter.

harm6

  • Hero Member
  • *****
  • Beiträge: 632
Antw: @@(lily)
« Antwort #2 am: Mittwoch, 2. August 2017, 10:10 »
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



« Letzte Änderung: Mittwoch, 2. August 2017, 14:09 von harm6 »

Malte

  • Hero Member
  • *****
  • Beiträge: 544
Antw: @@(lily)
« Antwort #3 am: Freitag, 4. August 2017, 07:54 »
Wieder was gelernt, danke! Ich hätte sowas schon ein paar mal brauchen können ;)