On Sat, Nov 3, 2012 at 5:54 PM, David Kastrup <d...@gnu.org> wrote: > Olivier Biot <olivier.b...@gmail.com> writes: > >> I definitely have problems with Scheme and LilyPond interpretation. I >> now have the Scheme standard open as well. >> >> I tried to simplify the initial job by first creating a function with >> one string argument returning either a string or a markup. Does not >> work. >> >> I tried hundreds of alternatives, with musoc-function and withj >> markup-command, with a define and define-scheme-funciton, to no avail. >> >> Why is the following not working?
[...] > One reason is because markup commands have rather rudimentary argument > parsing (to make you appreciate the work done on music functions more, > ha ha) and distinguish only markup, markup list, and Scheme as argument > type. A quoted LilyPond string counts only as "markup". And markup > commands can only be used inside of explicit markup. > > Then you use ( ) where they don't belong. Remember: those are _not_ > mere grouping constructs but form a list. And a list of lists is > something different from a list. In evaluated contexts (like this is), > ( ) are a function call. So you try calling "C sharp" as a function > (which does not work) and call the result of the cond as a function > again (which also does not work). > > Just because Scheme seems to be crawling with parens does not mean that > you can throw in a few more and hope that nobody will notice. > > '"cis" is awfully awkward (strings are self-quoting and don't need ' > before them) but not actually wrong. > >> \header { >> composer = "myself" >> title = \tonicEN "cis" >> } > > You would likely have to write > > title = \markup \tonicEN #"cis" > > here after fixing the above definition. Alternatively, use > > tonicEn = > #(define-scheme-function (parser layout tonic) (string?) ... > > in which case title = \toniEN "cis" should work fine. With the current > development version, you should be able to use \tonicEN pretty much > everywhere a string can be used, with 2.16.0 the uses will likely be > more restrained. On the right side of an assignment or as a function > argument, however, should work fine all the time. > > -- > David Kastrup Hi David, Thanks a lot - I now start to see the mistakes I made (excess parentheses around the cond expression and excess parentheses around the return values in the cond sub expressions). I have however to use quotes around the note name for it to work. Here's code that actually works, maybe it can be useful for others: %%% BEGIN SNIPPET \version "2.16.0" tonicEN = #(define-scheme-function (parser layout tonic) (string?) ( cond ( (string=? tonic "cis") "C sharp" ) ( (string=? tonic "dis") "D sharp" ) ) ) \header { composer = "myself" title = \tonicEN "cis" } \score { \relative c' { a bes cis deses e fisis ges } \layout {} } %%% END SNIPPET _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user