| partial_function ETC
{
$$ = MAKE_SYNTAX (partial_music_function, @$,
- scm_reverse_x (scm_car ($1), SCM_EOL),
- scm_reverse_x (scm_cdr ($1), SCM_EOL));
+ scm_reverse_x ($1, SCM_EOL));
}
;
partial_function:
MUSIC_FUNCTION function_arglist_partial
{
- $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
+ $$ = scm_acons ($1, $2, SCM_EOL);
}
| EVENT_FUNCTION function_arglist_partial
{
- $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
+ $$ = scm_acons ($1, $2, SCM_EOL);
}
| SCM_FUNCTION function_arglist_partial
{
- $$ = scm_cons (scm_list_1 ($1), scm_list_1 ($2));
+ $$ = scm_acons ($1, $2, SCM_EOL);
}
| MUSIC_FUNCTION EXPECT_SCM function_arglist_optional partial_function
{
- $$ = scm_cons (scm_cons ($1, scm_car ($4)),
- scm_cons ($3, scm_cdr ($4)));
+ $$ = scm_acons ($1, $3, $4);
}
| EVENT_FUNCTION EXPECT_SCM function_arglist_optional partial_function
{
- $$ = scm_cons (scm_cons ($1, scm_car ($4)),
- scm_cons ($3, scm_cdr ($4)));
+ $$ = scm_acons ($1, $3, $4);
}
| SCM_FUNCTION EXPECT_SCM function_arglist_optional partial_function
{
- $$ = scm_cons (scm_cons ($1, scm_car ($4)),
- scm_cons ($3, scm_cdr ($4)));
+ $$ = scm_acons ($1, $3, $4);
}
| MUSIC_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function
{
- $$ = scm_cons (scm_cons ($1, scm_car ($5)),
- scm_cons ($4, scm_cdr ($5)));
+ $$ = scm_acons ($1, $4, $5);
}
| EVENT_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function
{
- $$ = scm_cons (scm_cons ($1, scm_car ($5)),
- scm_cons ($4, scm_cdr ($5)));
+ $$ = scm_acons ($1, $4, $5);
}
| SCM_FUNCTION EXPECT_OPTIONAL EXPECT_SCM function_arglist_nonbackup partial_function
{
- $$ = scm_cons (scm_cons ($1, scm_car ($5)),
- scm_cons ($4, scm_cdr ($5)));
+ $$ = scm_acons ($1, $4, $5);
}
;
;; Used for chaining several music functions together. `final'
;; contains the last argument and still needs typechecking.
-(define (music-function-chain fun args final)
- (let* ((siglast (last (ly:music-function-signature fun)))
+(define (music-function-chain call final)
+ (let* ((fun (car call))
+ (siglast (last (ly:music-function-signature fun)))
(pred? (if (pair? siglast) (car siglast) siglast)))
(if (pred? final)
- (music-function fun (cons final args))
+ (music-function fun (cons final (cdr call)))
(begin
- (argument-error (1+ (length args)) pred? final)
+ (argument-error (length call) pred? final)
;; call music function just for the error return value
(music-function fun #f)))))
-(define-public (partial-music-function fun-list arg-list)
- (let* ((good (every list? arg-list))
- (sig (ly:music-function-signature (car fun-list))))
+(define-public (partial-music-function call-list)
+ (let* ((good (every list? call-list))
+ (sig (ly:music-function-signature (caar call-list))))
(and good
(ly:make-music-function
- (cons (car sig) (list-tail (cdr sig) (length (car arg-list))))
+ (cons (car sig) (list-tail sig (length (car call-list))))
(lambda rest
;; Every time we use music-function, it destructively
;; reverses its list of arguments. Changing the calling
;; avoid reusing any music expressions without copying and
;; want to let them point to the location of the music
;; function call rather than its definition.
- (let ((arg-list (ly:music-deep-copy arg-list (*location*))))
+ (let ((call-list (ly:music-deep-copy call-list (*location*))))
(fold music-function-chain
- (music-function (car fun-list)
- (reverse! rest (car arg-list)))
- (cdr fun-list) (cdr arg-list))))))))
+ (music-function (caar call-list)
+ (reverse! rest (cdar call-list)))
+ (cdr call-list))))))))
(define-public (void-music)
(ly:set-origin! (make-music 'Music)))