From d5ec16b680c1e411b3adf27eadfde3add7b59bca Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Tue, 1 Nov 2011 18:51:40 +0100 Subject: [PATCH] Implement \once as music function able to operate on complex stuff. --- lily/lily-lexer.cc | 1 - lily/parser.yy | 6 +----- ly/music-functions-init.ly | 12 ++++++++++++ scm/ly-syntax-constructors.scm | 5 ++--- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/lily/lily-lexer.cc b/lily/lily-lexer.cc index 1298604f12..b19639b579 100644 --- a/lily/lily-lexer.cc +++ b/lily/lily-lexer.cc @@ -72,7 +72,6 @@ static Keyword_ent the_key_tab[] {"name", NAME}, {"new", NEWCONTEXT}, {"notemode", NOTEMODE}, - {"once", ONCE}, {"override", OVERRIDE}, {"paper", PAPER}, {"remove", REMOVE}, diff --git a/lily/parser.yy b/lily/parser.yy index 0adb95c2f5..1e693c89c0 100644 --- a/lily/parser.yy +++ b/lily/parser.yy @@ -229,7 +229,6 @@ void set_music_properties (Music *p, SCM a); %token MIDI "\\midi" %token NAME "\\name" %token NOTEMODE "\\notemode" -%token ONCE "\\once" %token OVERRIDE "\\override" %token PAPER "\\paper" %token REMOVE "\\remove" @@ -1614,10 +1613,7 @@ simple_music_property_def: music_property_def: simple_music_property_def { - $$ = LOWLEVEL_MAKE_SYNTAX (ly_lily_module_constant ("property-operation"), scm_cons (PARSER->self_scm (), scm_cons2 (make_input (@$), SCM_BOOL_F, $1))); - } - | ONCE simple_music_property_def { - $$ = LOWLEVEL_MAKE_SYNTAX (ly_lily_module_constant ("property-operation"), scm_cons (PARSER->self_scm (), scm_cons2 (make_input (@$), SCM_BOOL_T, $2))); + $$ = LOWLEVEL_MAKE_SYNTAX (ly_lily_module_constant ("property-operation"), scm_cons2 (PARSER->self_scm (), make_input (@$), $1)); } ; diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index 185ee7be38..5dad573ac0 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -578,6 +578,18 @@ octaveCheck = (make-music 'RelativeOctaveCheck 'pitch pitch)) +once = +#(define-music-function (parser location music) (ly:music?) + (_i "Set @code{once} to @code{#t} on all layout instruction events in @var{music}.") + (music-map + (lambda (m) + (cond ((music-is-of-type? m 'layout-instruction-event) + (set! (ly:music-property m 'once) #t)) + ((ly:duration? (ly:music-property m 'duration)) + (ly:music-warning m (_ "Cannot apply \\once to timed music")))) + m) + music)) + ottava = #(define-music-function (parser location octave) (integer?) (_i "Set the octavation.") diff --git a/scm/ly-syntax-constructors.scm b/scm/ly-syntax-constructors.scm index 841ad92e97..ee6140ab1f 100644 --- a/scm/ly-syntax-constructors.scm +++ b/scm/ly-syntax-constructors.scm @@ -177,7 +177,7 @@ into a @code{MultiMeasureTextEvent}." (if create-new (set! (ly:music-property csm 'create-new) #t)) csm)) -(define-ly-syntax (property-operation parser location once ctx music-type symbol . args) +(define-ly-syntax (property-operation parser location ctx music-type symbol . args) (let* ((props (case music-type ((PropertySet) (list 'value (car args))) ((PropertyUnset) '()) @@ -191,11 +191,10 @@ into a @code{MultiMeasureTextEvent}." (list 'grob-property-path (car args)) (list 'grob-property-path args))) (else (ly:error (_ "Invalid property operation ~a") music-type)))) - (oprops (if once (cons* 'once once props) props)) (m (apply make-music music-type 'symbol symbol 'origin location - oprops))) + props))) (make-music 'ContextSpeccedMusic 'element m 'context-type ctx -- 2.39.5