From: David Kastrup Date: Wed, 9 Dec 2015 20:33:00 +0000 (+0100) Subject: Issue 4687/1: Let \etc in partial markup commands stand for any arguments X-Git-Tag: release/2.19.34-1~5^2~6 X-Git-Url: https://git.donarmstrong.com/lilypond.git?p=lilypond.git;a=commitdiff_plain;h=70eaa17f47486111dc6a7a88aacbe1944514261b Issue 4687/1: Let \etc in partial markup commands stand for any arguments Previously, \etc could only stand for a final markup argument. Now an arbitrary kind and number of arguments from the last markup command in a markup command chain may be omitted. Example: quarter-markup = \markup \note-by-number #2 \etc \markup { 3/8: \quarter #1 #UP } --- diff --git a/lily/parser.yy b/lily/parser.yy index 35d0aa48dc..c60c6ed64c 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -3671,7 +3671,7 @@ full_markup: ; partial_markup: - markup_mode markup_head_1_list ETC + markup_mode markup_partial_function ETC { $$ = MAKE_SYNTAX (partial_markup, @2, $2); parser->lexer_->pop_state (); @@ -3789,6 +3789,37 @@ markup_command_list_arguments: } ; +markup_partial_function: + MARKUP_FUNCTION markup_arglist_partial + { + $$ = scm_list_1 (scm_cons ($1, scm_reverse_x ($2, SCM_EOL))); + } + | markup_head_1_list MARKUP_FUNCTION markup_arglist_partial + { + $$ = scm_cons (scm_cons ($2, scm_reverse_x ($3, SCM_EOL)), + $1); + } + ; + +markup_arglist_partial: + EXPECT_MARKUP markup_arglist_partial + { + $$ = $2; + } + | EXPECT_SCM markup_arglist_partial + { + $$= $2; + } + | EXPECT_MARKUP markup_command_list_arguments + { + $$ = $2; + } + | EXPECT_SCM markup_command_list_arguments + { + $$ = $2; + } + ; + markup_head_1_item: MARKUP_FUNCTION EXPECT_MARKUP markup_command_list_arguments { $$ = scm_cons ($1, scm_reverse_x ($3, SCM_EOL)); diff --git a/scm/ly-syntax-constructors.scm b/scm/ly-syntax-constructors.scm index 810a30b333..0a12672095 100644 --- a/scm/ly-syntax-constructors.scm +++ b/scm/ly-syntax-constructors.scm @@ -203,14 +203,17 @@ into a @code{MultiMeasureTextEvent}." (define-public (partial-markup commands) ;; Like composed-markup-list, except that the result is a single ;; markup command that can be applied to one markup - (define (compose arg) + (define (compose rest) (fold (lambda (cmd prev) (append cmd (list prev))) - arg - commands)) - (let ((chain (lambda (layout props arg) - (interpret-markup layout props (compose arg))))) - (set-object-property! chain 'markup-signature (list markup?)) + (append (car commands) rest) + (cdr commands))) + (let ((chain (lambda (layout props . rest) + (interpret-markup layout props (compose rest))))) + (set! (markup-command-signature chain) + (list-tail + (markup-command-signature (caar commands)) + (length (cdar commands)))) chain)) (define-public (property-set context property value)