2016-04-23 16:27 GMT+02:00 Mark Knoop <m...@opus11.net>: > Thanks David, > > At 15:01 on 23 Apr 2016, David Kastrup wrote: >>Mark Knoop <m...@opus11.net> writes: >>> On upgrading to 2.19.32, one of my regular functions no longer works. >>> It seems that a single number as the first argument is now accepted >>> as a number-list whereas before it was not and thus became the second >>> argument. >>> >>> Whilst the new possibility to write lists as 1,2,3,4 is very nice, is >>> there any way to alter my function definition to achieve the old >>> behaviour? >>> >>> myFunction = #(define-void-function >>> (a b c d) >>> ((number-list? '()) number? (boolean? #t) fraction?) >>> (print "\na=~s b=~s c=~s d=~s\n" a b c d)) >>> >>> { >>> % this works when all arguments are specified >>> \myFunction 1,2,3,4 4 ##t 4/4 >>> % not specifying first argument no longer works >>> \myFunction 4 4/4 >>> } >> >>You can write your own predicate that will reject lists containing a >>single number. But it will then also reject an explicit #'(3). I'm >>afraid that you just created an interface that was too delicate to >>survive further development. > > In this instance single number lists are not relevant anyway. So I've > tried this method: > > #(define (multi-number-list? x) > (and (list? x) > (< 1 (length x)) > (every number? x))) > > testfn = #(define-void-function > (a) (multi-number-list?) > (print "\na=~s length=~s\n" a (length a))) > > { > % this works > \testfn #'(1 2 3) > % this doesn't - why? > \testfn 1,2,3 > % this fails as expected > \testfn 1 > } > > ...and was surprised to see that the new list syntax doesn't work in > this instance. It's not clear to me at what point lilypond/guile > decides that something is a list or not.
A probably related observation: \version "2.19.40" my-time = #(define-music-function (v1 v2)(scheme? scheme?) #{ \time $v1 $v2 #}) %% works { %% default with comma-separated list \time 2,2,1 5/8 g'8 8 8 8 8 %% or \time 1,1,2,1 5/8 g'8 8 8 8 8 } %% works { %% \time redefined with common-list \my-time #'(2 2 1) 5/8 g'8 8 8 8 8 %% or \my-time #'(1 1 2 1) 5/8 g'8 8 8 8 8 } %% doesn't work { %% \time redefined with comma-separated list \my-time 2,2,1 5/8 g'8 8 8 8 8 %% or \my-time 1,1,2,1 5/8 g'8 8 8 8 8 } A problem with the function-macros? Cheers, Harm _______________________________________________ lilypond-user mailing list lilypond-user@gnu.org https://lists.gnu.org/mailman/listinfo/lilypond-user