On 3/13/23 1:25 PM, Jean Abou Samra wrote:

Le lundi 13 mars 2023 à 13:04 -0700, Paul Scott a écrit :

I've read your wonderful scheme documentation.  I'm still struggling to make sense of Aaron's simple code
\fixed c' {
   c1
   \set Score.repeatCommands = #|((volta ,voltaFine)) c4 d c2 \bar "|."    \set Score.repeatCommands = #|((volta #f) (volta ,voltaCont))
   f4 g a b
   \set Score.repeatCommands = #'((volta #f))
}

I'm extremely familiar with a number of programming languages including Forth.  If one of you could say more about what the line:
   \set Score.repeatCommands = #`((volta #f) (volta ,voltaCont))
does and how it relates with

   \set Score.repeatCommands = #(list(list 'volta voltaCont))

|I might be able to go farther. |

TIA for any more help  with this,

The format of |repeatCommands| is a list where each element is itself a list. The first element of each sublist (element of the main list) is a "command", namely a symbol, which can be |volta|, |start-repeat| or |end-repeat|.

 *

    If the command is |volta|, LilyPond expects one remaining element
    in the sublist, which can be

      o a markup, to start a volta bracket and print this text under
        it (note that a simple string is also a valid markup),
      o |#f| (the boolean /false/), to end a volta bracket previously
        started with the first form.
 *

    If the command is |start-repeat|, it prints a start repeat bar line.

 *

    If the command is |end-repeat|, it prints an end repeat bar line.

The expression

|#(list (list 'volta voltaCont)) |

uses the |list| function to create a list with one element inside. That element is |(list 'volta voltaCont)|, which is itself a list with two elements, |'volta| and |voltaCont|. The first element is a quoted symbol, so it's not evaluated and remains as a symbol. The second element is also a symbol but without a quote. Since symbols are not self-evaluating, but evaluate by looking up variables, this reads the value of the |voltaCont| variable. So you have

|list | list element 1: | list | list element 1: the symbol volta | list element 2: the markup contained in the variable voltaCont |

which matches the form for a repeatCommands with one command, "volta", starting a volta bracket with the text contained in the variable "voltaCont".

The expression

|#`((volta #f) (volta ,voltaCont)) |

is a quasiquote. Since a quasiquote is “almost a quote”, it means that Scheme looks literally at what expression you have entered, rather than evaluating it. Because of the parentheses, it's a list. That list contains two sublists. The first one is |(volta #f)|. Again, it's quoted, so it's not evaluated. (If it were evaluated, it would look up the function “volta” and apply it to the boolean |#f|.) That list is made of the symbol |volta| and the boolean |#f|.

The second sublist is |(volta ,voltaCont)|. Again, it's quoted, so not evaluated. The first element is |volta|, a symbol. The second element has an unquote on it (the comma), so it /does/ get evaluated. It's a symbol, |voltaCont|, and symbols evaluate by looking up variables, so it gets the value of |voltaCont| and inserts that markup into the sublist.

The result is

|list | list element 1: | list: | | list element 1: the symbol volta | | list element 2: the boolean #f | list element 2: | list: | | list element 1: the symbol volta | | list element 2: the markup contained in the variable voltaCont |

and it matches the format of |repeatCommands| for two commands: ending a previously started volta (the first element) and starting a new one (the second element).

Did it help to read it very verbosely like this?

Probably.  I have no excuse for not getting it after this.  I won't be able to spend any more time on for a few hours.

Thank you very much,

Paul

Reply via email to