Le 24/05/2021 à 19:21, Lukas-Fabian Moser a écrit :
Hi,
during my experiments with TextSpanners I stumbled upon the following:
\version "2.22"
\layout {
\override NoteHead.after-line-breaking =
#(lambda (grob) (pretty-print "I explode."))
}
{
a4
}
explodes because pretty-print isn't available (the same happens for
functions like "last" etc.)
In contrast, the following works:
\version "2.22"
{
\override NoteHead.after-line-breaking =
#(lambda (grob) (pretty-print "I work just fine."))
a4
}
What's the reason for the different availability of scheme library
functions between working in \layout {} vs. in music?
I never understood the whole thing fully (and it is at the heart of the
problem that led to disabling LilyPond on WikiMedia), but output
definitions have their own scope, which is implemented as a Guile
module. pretty-print is defined by another Guile module, (ice-9
pretty-print), which is generally available in LilyPond code because it
is loaded upon initialization of LilyPond (see init.ly). last is in
(srfi srfi-1), which is also loaded by default.
If you want these functions in a \layout, you have to load the
corresponding module by hand:
\layout {
#(use-modules (ice-9 pretty-print))
\override NoteHead.after-line-breaking =
#(lambda (grob) (pretty-print "I explode."))
}
{
a4
}
Don't ask me why this works then:
#(define myVar 5)
\layout {
#(display myVar)
}
It would seem that assignments work a bit differently from loading
modules, but I'm not looking at the code right now.
Hope that helps,
Jean