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

  - a markup, to start a volta bracket and print this text under it (note that 
a simple string is also a valid markup),
  - `#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?

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to