Hello David,
sorry for this kind-a-basic-scheme-question(s) ... ;-)
How do I inject variables into an empty module?
I assume, the string-eval approach loads up the whole guile-tool-chain,
so that define is defined.
The function I am thinking of shall work like this:
<pseudo-snip>
#(define-public (set-book-headers! book header) ; book is a book, header
is an a-list, containig all vars to inject into header
(let ((bookhead (ly:book-header book)))
; if book has no header, create one
(if (not bookhead) (let ((bh (/make-module/)))
(set! bookhead bh)
(ly:book-set-header! bookhead)
))
(for-each (lambda (p)
(if (pair? p)
(let ((key (car p))
(val (cdr p)))
(/inject key=val/ bookhead))))
header)
))
</pseudo-snip>
So AFAICS there are at least 3 different ways to create a module to use
in a header:
1: (eval-string "(define-module (a b))")
2: (ly:book-header #{ \book { \header { } } #})
3: (make-module)
The first two are some kind of cheating, but create modules, where I can
inject my vars using
(eval `(define ,key (quote ,val)) bookhead)
I would prefer the 3rd one, if I knew, how to inject the vars inside the
empty module.
In my first post, regarding this stuff, I used eval-string, because I
assume it produces less overhead than creating a book in inline lily-code.
My function shall modify the given book and not create a new one, so
that the change is visible outside the function-scope.
Of course, one might return the changed/copied book and use that for
processing, but I still like to know the answers to my questions? ;-)
Happy sunday!
Cheers, Jan-Peter
make-module would be obvious.
But if you try a (eval '(define title "Titel") (make-module)) it fails
with "Unbound variable: define"?
Well, where would a definition for "define" come from in an empty
module?
_______________________________________________
lilypond-user mailing list
lilypond-user@gnu.org
https://lists.gnu.org/mailman/listinfo/lilypond-user