Autor Thema: Quelltext von Lilypond-Scheme-Prozeduren?  (Gelesen 2166 mal)

jps

  • Gast
Quelltext von Lilypond-Scheme-Prozeduren?
« am: Donnerstag, 10. März 2016, 09:47 »
Hallo!

Beim Einstieg in die Lilypond-Scheme-Syntax hat sich mir zunehmend die Frage gestellt, wie man sich zielgerichtet (ohne die Stecknadel im Heuhaufen suchen zu müssen) den Quelltext zu solchen Scheme-Prozeduren anzeigen kann, die man in Lilypond-Scheme-Programmen findet, die aber nicht zum Sprachumfang von guile gehören.

Ein (absichtlich sehr simpel gewähltes) Beispiel:

An einigen Stellen im Scheme-Tutorial taucht die Funktion first auf (eine genaue Stelle kann ich grad nicht angeben, weil lilypond.org nicht erreichbar zu sein scheint). Aus dem Zusammenhang heraus ist zu vermuten, dass first das gleiche macht wie car. Aber macht es wirklich genau das gleiche und macht es das auch in allen denkbaren Zusammenhängen (ist es also 100%ig äquivalent)? - Das würde sich angesichts offenbar fehlender Dokumentation nur durch einen Blick in den Quelltext sicher klären lassen, aber eine allgemeine Suche nach solchen Allerweltsworten wie first bringt ja kaum etwas. Deshalb hoffe ich inständig, dass es einen Befehl gibt, der einem unmittelbar die Referenz zum Quelltext einer bestimmten Prozedur liefert.

Herzliche Grüße
Jost

harm6

  • Gast
Re: Quelltext von Lilypond-Scheme-Prozeduren?
« Antwort #1 am: Donnerstag, 10. März 2016, 11:02 »
Hallo Jost,

erstmal grundsätzlich, wenn ich etwas suche dann verwende ich
die hypersearch meines jEdit
guile, also im Terminal eingeben guile
die scheme-sandbox, aufzurufen im Terminal mit lilypond scheme-sandbox
im LilyPond-git-repository git grep ...
im guile-git-repository git grep

Meistens reicht die hypersearch
Direktes guile führt häufig nicht zum Ziel, da keine module aktiviert sind. Deshalb is first dort nicht zu finden.
Die scheme-sanbox hat diese module aktiviert. Somit ist first auch zu finden.
first ist Teil von srfi-1 also originales guile, nicht LilyPond.
lilypond scheme-sandbox
GNU LilyPond 2.19.36
Processing `/home/harm/lilydevel/usr/share/lilypond/current/ly/scheme-sandbox.ly'
Parsing...
guile> first
#<primitive-procedure car>
Wenn Du die Definitionen haben willst kannst Du (procedure-source ...) versuchen.
Da die meisten Anwender keinen Bedarf an git-repositoties haben gehe ich nicht weiter darauf ein.

Aber hier ein anderes Beispiel: sign
In der sandbox:
Zitat
guile> sign
ERROR: Unbound variable: sign
ABORT: (unbound-variable)

Ich weiß aber, daß sign in LilyPond definiert ist...
Warum unbound? Und was jetzt?

sign ist nicht public!
Man kann es aber erhalten mit @@-syntax (nur für debugging oder als "last resort")

guile> (@@ (lily) sign)
#<procedure sign (x)>
guile> (procedure-source (@@ (lily) sign))
(lambda (x) (if (= x 0) 0 (if (< x 0) -1 1)))

HTH,
  Harm

jps

  • Gast
Re: Quelltext von Lilypond-Scheme-Prozeduren?
« Antwort #2 am: Donnerstag, 10. März 2016, 17:54 »
Vielen Dank für die vielen Hinweise und Tipps!

Ich konnte alle Beispiele und Möglichkeiten gut nachvollziehen. Trotzdem stehe ich im Moment noch auf dem Schlauch, wenn ich z.B. versuche, die Definition von assoc-get zu finden (nur wieder als einfaches Beispiel) - manche Suchen klappen auf Anhieb, und andere auf keinem der Wege, und ich verstehe noch nicht, warum.

Herzliche Grüße
Jost

Edit: ich bekomme zwar #<primitive-procedure ly:assoc-get>, aber damit bin ich ja im Prinzip so schlau als wie zuvor. procedure-source ergibt #f.
« Letzte Änderung: Donnerstag, 10. März 2016, 18:02 von jps »

harm6

  • Gast
Re: Quelltext von Lilypond-Scheme-Prozeduren?
« Antwort #3 am: Donnerstag, 10. März 2016, 19:41 »
Um da eventuell weiterzukommen brauchst Du das repository (oder mußt Dich auf die Doku zu ly:assoc-get in der IR verlassen)

Um es mal durchzuexerzieren,

(1)
Im git-repository retourniert

git grep "assoc-get"

sehr viele Treffer, u.a.:

scm/lily-library.scm:(define-public assoc-get ly:assoc-get)

Das ist die komplette Definition, also ein einfacher alias.

(2)
git grep "ly:assoc-get"

retourniert, u.a.:

lily/general-scheme.cc:LY_DEFINE (ly_assoc_get, "ly:assoc-get",

Im C++-file general-scheme.cc kann man dann

LY_DEFINE (ly_assoc_get, "ly:assoc-get",
           2, 2, 0,
           (SCM key, SCM alist, SCM default_value, SCM strict_checking),
           "Return value if @var{key} in @var{alist}, else @var{default-value}"
           " (or @code{#f} if not specified).  If @var{strict-checking} is set"
           " to @code{#t} and @var{key} is not in @var{alist}, a programming_error"
           " is output.")
{
  LY_ASSERT_TYPE (ly_cheap_is_list, alist, 2);

  SCM handle = scm_assoc (key, alist);
  if (scm_is_pair (handle))
    return scm_cdr (handle);

  if (SCM_UNBNDP (default_value))
    default_value = SCM_BOOL_F;

  if (to_boolean (strict_checking))
    {
      string key_string = ly_scm2string
                          (scm_object_to_string (key, SCM_UNDEFINED));
      string default_value_string = ly_scm2string
                                    (scm_object_to_string (default_value,
                                                           SCM_UNDEFINED));
      programming_error ("Cannot find key `"
                         + key_string
                         + "' in alist, setting to `"
                         + default_value_string + "'.");
    }

  return default_value;
}
finden.

Allerdings brauchst Du git, die C++-files finden sich nicht in den released Versions. Darüberhinaus sind die C++-Sachen nicht durch den user zu beeinflussen. Von einer eigenen Neukompilierung LilyPonds mal abgesehen, was aber natürlich keine gute Idee ist, da letztendlich niemand anderer dann Deine files kompilieren kann. (Ohne Deine Änderungen ebenfalls anzuwenden und welcher user hat schon git, und wieviele davon würden sich dieser Mühe unterziehen ...)


Gruß,
  Harm

jps

  • Gast
Re: Quelltext von Lilypond-Scheme-Prozeduren?
« Antwort #4 am: Freitag, 11. März 2016, 11:46 »
Danke! Das war wieder sehr hilfreich.

Durch diese ergänzenden Erläuterungen kann ich die gesamte Lilypond-Struktur nun doch sehr viel besser einschätzen als zuvor, und mir ist jetzt auch klar, warum ich ohne die Verwendung von git nicht weiterkommen konnte bei meiner Quelltextsuche. Aber so sollte es ja nun kein Problem mehr geben (eigenhändig ändern will ich natürlich nichts, aber ich schaue halt immer bei Bedarf gerne möglichst tief in den Sourcecode hinein).

Herzliche Grüße
Jost