lilypond-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Custom S-expression export


From: Saul Tobin
Subject: Re: Custom S-expression export
Date: Tue, 18 Mar 2025 10:38:07 -0400

I got inclusion of the original init file working with the following code.
IMHO it feels like a very crude hack. Is there a scheme function that would
include a LilyPond file in the current context?

Code:

$(ly:parser-include-string
  (format #f "\\include \"~a\""
   (string-append (ly:effective-prefix) "/ly/init.ly")))
 
That is actually the correct/best way to do it right now. There isn't a direct Scheme API for "normal" includes. The Scheme functions for parsing are for other situations, like embedded code blocks, and they won't do exactly what you want.
 
I was talking about \displayMusic, as my experience with Guile's `write` has
been that it only prints "#<Book>" or "#<Score>" which I considered to be of
not much use.

That's because LilyPond uses custom objects defined using Guile's legacy C++ API, and the Scheme interface of such objects, including their print representation, is fully controlled by the class implementation. Many of these classes implement only minimal Guile interfaces.

 > I believe that simply (write foo) where foo
 > is a ly:music? captures all the available information, including input
 > locations.

It actually does. I was not awareof this. Simple Scheme lists are likely
easier to parse. This format produced by write probably is not meant to be
machine-readable (for example source file name strings are not quoted).
 
I believe that `write` is meant to output data suitable to be loaded as Scheme code, while `display` is adds quoting to facilitate human readability. However, that only really applies to standard Guile data. LilyPond music expressions are custom property objects defined in C++, and I don't think they can be loaded by evaluating their `write` representation.
 
 > If this were going to be included in LilyPond, you would want a design
 > other than an alternate init file, in order to support generating this
 > auxiliary output in parallel with print and/or MIDI, similar to the way
 > lilypond-book aux files are generated.

I see, and this is not the intention of my exporter. I specifically want to
inhibit all other output generation.

I would actually want to develop this towards a REPL, where a user can
interactively enter music expressions and LilyPond would process them in its
current context and return a machine-readable representation.

LilyPond actually ships with a REPL, but it's a Guile REPL so music expressions would need to be wrapped in #{ #}, and you can't put top level syntax like variable assignments inside #{ #}. However other than that, it does exactly what you want I think. You can run it with `lilypond scheme-sandbox`. I've used this heavily to support features of Emacs lilypond-ts-mode.

Saul

reply via email to

[Prev in Thread] Current Thread [Next in Thread]