Am 17.11.2015 um 03:12 schrieb Pierre-Luc Gauthier:
> So, after reading the "Automated processing of multiple books" thread
> and few hours trying to figure this out, I am still not able to make
> it work.
> The higher order function "for-each" somehow cannot call the
> "compilePart" function and Lilyponds GUILE interpreter returns "Wrong
> type to apply".
>
> Why?
This is because you did not pass a music expression but a symbol.
The problem is in the definition of the "parts" variable. This is
defined to be a list of pairs (which is right) but in
' ("piccolo" . piccoloPart)
the leading quotation mark makes the elements of the following pair or
list "quoted" as well. So it's basically the same as
(list "piccolo" 'piccoloPart)
If you want to use the "quote" style definition but need some of the
elements to be treated as their actual value instead of simply names we
have the "quasiquote" style where you precede the parenthesis with a
backtick:
`(item1 . item2)
`("piccolo" . piccoloPart)
however would result in the same error. But if you have "quasiquoted" an
expression you can "unquote" individual elements using the comma:
`("piccolo" . ,piccoloPart)
finally works.
So
parts = #(list
;; This is a list of pairs containing parts informations
`("piccolo" . ,piccoloPart)
`("bass" . ,bassPart))
will make your file compile and produce two parts
HTH
Urs
>
> Simple tests allowed me to prove that "for-each" *can* call functions
> like "display" but not my "compilePart".
>
> I am very very new to scheme and let alone scheme inside the pond and
> I really got a kick out of this journey finally understanding why
> those #, #', #{, #}, $, parser, location, etc were there in the first
> place.
> It's really satisfying.
>
> Here is the code for my MWE.
>
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
> \version "2.18.2"
>
> \language "english"
>
> piccoloPart = \new Staff {
> \new Voice {
> \relative c' {
> d4 e fs g |
> a1\fermata |
> }
> }
> }
>
> bassPart = \new Staff {
> \new Voice {
> \relative c {
> \clef bass
> c4 d e f |
> g1\fermata |
> }
> }
> }
>
> compilePart = #(define-void-function ( parser location music name)
> ;; This function is used to do and engrave a book
> ;; $music should be a musical expression
> ;; $name should be a string for the book output suffix
> (ly:music? string?)
> (let ((paper #{ \paper {} #})
> (layout #{ \layout {} #})
> (book #{ \book { \score { $music } } #}))
> (ly:book-process book paper layout name)))
>
> % _This_ is to test the compilePart function
> %\compilePart \piccoloPart #"piccolo"
> % \compilePart \bassPart #"bass"
>
> parts = #(list
> ;; This is a list of pairs containing parts informations
> '("piccolo" . piccoloPart)
> '("bass" . bassPart))
>
> % _This_ is to test that the data can be extracted succesfully from the list
> %\compilePart #(cdr (car parts)) #(car (car parts)) % First entry
> %\compilePart #(cdr (car (cdr parts))) #(car (car (cdr parts))) % Second entry
>
> % Somehow _this_ does not work.
> %{#(for-each
> (lambda (p)
> (let ((name (car p))
> (music (cdr p)))
> (compilePart music name )
> ))
> parts)%}
> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
>
> 2015-11-16 14:55 GMT-05:00 Pierre-Luc Gauthier <[email protected]>:
>> Possible duplicate!
>>
>> It appears I have missed the very similar thread "Automated processing
>> of multiple books"
>>
>> I'll digest that first ;-)
>>
>> --
>> Pierre-Luc Gauthier
>
>
>
>
> _______________________________________________
> lilypond-user mailing list
> [email protected]
> https://lists.gnu.org/mailman/listinfo/lilypond-user
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user