From f97e0fe119c56ade70262d227b5d05ee83391785 Mon Sep 17 00:00:00 2001 From: David Kastrup Date: Fri, 10 Jul 2015 11:00:36 +0200 Subject: [PATCH] Issue 4488/2: Use ly:set-origin! and two-argument form of ly:music-deep-copy --- ly/music-functions-init.ly | 23 +++++----- scm/define-music-callbacks.scm | 12 +++--- scm/ly-syntax-constructors.scm | 79 ++++++++++++++++------------------ scm/music-functions.scm | 18 +++----- 4 files changed, 60 insertions(+), 72 deletions(-) diff --git a/ly/music-functions-init.ly b/ly/music-functions-init.ly index 6e0f5b5651..ea20f1f755 100644 --- a/ly/music-functions-init.ly +++ b/ly/music-functions-init.ly @@ -1163,18 +1163,17 @@ change to the following voice." (and (or split-elt split-elts) (map (lambda (e es) - (apply music-clone music - (append - ;; reassigning the origin of the parent only - ;; makes sense if the first expression in the - ;; result is from a distributed origin - (let ((origin - (if (ly:music? elt) - (and (ly:music? e) (ly:music-property e 'origin #f)) - (and (pair? es) (ly:music-property (car es) 'origin #f))))) - (if origin (list 'origin origin) '())) - (if (ly:music? e) (list 'element e) '()) - (if (pair? es) (list 'elements es) '())))) + (let ((m (ly:music-deep-copy music + ;;; reassigning the origin of the parent only + ;;; makes sense if the first expression in the + ;;; result is from a distributed origin + (or (and (ly:music? e) e) + (and (pair? es) (car es)))))) + (if (ly:music? e) + (set! (ly:music-property m 'element) e)) + (if (pair? es) + (set! (ly:music-property m 'elements) es)) + m)) (or split-elt (circular-list #f)) (or split-elts (circular-list #f)))))) (let ((voices (recurse-and-split music))) diff --git a/scm/define-music-callbacks.scm b/scm/define-music-callbacks.scm index f2d89ae71f..5cc1db14cd 100644 --- a/scm/define-music-callbacks.scm +++ b/scm/define-music-callbacks.scm @@ -23,13 +23,11 @@ (define (mm-rest-child-list music) "Generate events for multimeasure rests, to be used by the sequential-iterator" - (let ((location (ly:music-property music 'location))) - (list (make-music 'BarCheck - 'origin location) - (make-music 'MultiMeasureRestEvent - (ly:music-deep-copy music)) - (make-music 'BarCheck - 'origin location)))) + (ly:set-origin! (list (make-music 'BarCheck) + (make-music 'MultiMeasureRestEvent + (ly:music-deep-copy music)) + (make-music 'BarCheck)) + music)) (define (make-unfolded-set music) (let ((n (ly:music-property music 'repeat-count)) diff --git a/scm/ly-syntax-constructors.scm b/scm/ly-syntax-constructors.scm index c595755e5a..be8da275d8 100644 --- a/scm/ly-syntax-constructors.scm +++ b/scm/ly-syntax-constructors.scm @@ -19,11 +19,6 @@ #:use-module (lily) #:use-module (srfi srfi-1)) -;; Sets music origin to (*location*) -(define (here! m) - (set! (ly:music-property m 'origin) (*location*)) - m) - (define-public (music-function-call-error fun m) (let* ((sig (ly:music-function-signature fun)) (pred (if (pair? (car sig)) (caar sig) (car sig)))) @@ -48,7 +43,7 @@ (m (and good (apply (ly:music-function-extract fun) (reverse! args rest))))) (if (and good (pred m)) - (if (ly:music? m) (here! m) m) + (if (ly:music? m) (ly:set-origin! m) m) (if good (music-function-call-error fun m) (and (pair? (car sig)) (cdar sig)))))) @@ -61,26 +56,26 @@ (*location*))) (define-public (void-music) - (here! (make-music 'Music))) + (ly:set-origin! (make-music 'Music))) (define-public (sequential-music mlist) - (here! (make-sequential-music mlist))) + (ly:set-origin! (make-sequential-music mlist))) (define-public (simultaneous-music mlist) - (here! (make-simultaneous-music mlist))) + (ly:set-origin! (make-simultaneous-music mlist))) (define-public (event-chord mlist) - (here! (make-music 'EventChord - 'elements mlist))) + (ly:set-origin! (make-music 'EventChord + 'elements mlist))) (define-public (unrelativable-music mus) - (here! (make-music 'UnrelativableMusic - 'element mus))) + (ly:set-origin! (make-music 'UnrelativableMusic + 'element mus))) (define-public (context-change type id) - (here! (make-music 'ContextChange - 'change-to-type type - 'change-to-id id))) + (ly:set-origin! (make-music 'ContextChange + 'change-to-type type + 'change-to-id id))) (define-public (tempo text . rest) (let* ((unit (and (pair? rest) @@ -88,10 +83,10 @@ (count (and unit (cadr rest))) (range-tempo? (pair? count)) - (tempo-change (here! (make-music 'TempoChangeEvent - 'text text - 'tempo-unit unit - 'metronome-count count))) + (tempo-change (ly:set-origin! (make-music 'TempoChangeEvent + 'text text + 'tempo-unit unit + 'metronome-count count))) (tempo-set (and unit (context-spec-music @@ -111,7 +106,7 @@ tempo-change))) (define-public (repeat type num body alts) - (here! (make-repeat type num body alts))) + (ly:set-origin! (make-repeat type num body alts))) (define (script-to-mmrest-text music) "Extract @code{'direction} and @code{'text} from @var{music}, and transform @@ -122,20 +117,20 @@ into a @code{MultiMeasureTextEvent}." music)) (define-public (multi-measure-rest duration articulations) - (here! (make-music 'MultiMeasureRestMusic - 'articulations (map script-to-mmrest-text articulations) - 'duration duration))) + (ly:set-origin! (make-music 'MultiMeasureRestMusic + 'articulations (map script-to-mmrest-text articulations) + 'duration duration))) (define-public (repetition-chord duration articulations) - (here! (make-music 'EventChord - 'duration duration - 'elements articulations))) + (ly:set-origin! (make-music 'EventChord + 'duration duration + 'elements articulations))) (define-public (context-specification type id ops create-new mus) (let ((csm (context-spec-music mus type id))) (set! (ly:music-property csm 'property-operations) ops) (if create-new (set! (ly:music-property csm 'create-new) #t)) - (here! csm))) + (ly:set-origin! csm))) (define-public (composed-markup-list commands markups) ;; `markups' being a list of markups, eg (markup1 markup2 markup3), @@ -178,12 +173,12 @@ into a @code{MultiMeasureTextEvent}." (list 'grob-property-path (car args)) (list 'grob-property-path args))) (else (ly:error (_ "Invalid property operation ~a") music-type)))) - (m (here! (apply make-music music-type - 'symbol symbol - props)))) - (here! (make-music 'ContextSpeccedMusic - 'element m - 'context-type ctx)))) + (m (ly:set-origin! (apply make-music music-type + 'symbol symbol + props)))) + (ly:set-origin! (make-music 'ContextSpeccedMusic + 'element m + 'context-type ctx)))) (define (get-first-context-id! mus) "Find the name of a ContextSpeccedMusic, possibly naming it" @@ -202,7 +197,7 @@ into a @code{MultiMeasureTextEvent}." '()))) (define-public (lyric-event text duration) - (here! (make-lyric-event text duration))) + (ly:set-origin! (make-lyric-event text duration))) (define-public (lyric-combine sync sync-type music) ;; CompletizeExtenderEvent is added following the last lyric in MUSIC @@ -210,7 +205,7 @@ into a @code{MultiMeasureTextEvent}." ;; be completed if the lyrics end before the associated voice. (append! (ly:music-property music 'elements) (list (make-music 'CompletizeExtenderEvent))) - (here! + (ly:set-origin! (make-music 'LyricCombineMusic 'element music 'associated-context sync @@ -233,11 +228,11 @@ into a @code{MultiMeasureTextEvent}." (lambda (mus) (with-location (ly:music-property mus 'origin) - (here! (make-music 'ContextSpeccedMusic - 'create-new #t - 'context-type 'Lyrics - 'element - (lyric-combine - voice-name voice-type mus))))) + (ly:set-origin! (make-music 'ContextSpeccedMusic + 'create-new #t + 'context-type 'Lyrics + 'element + (lyric-combine + voice-name voice-type mus))))) addlyrics-list))) (make-simultaneous-music (cons voice lyricstos)))) diff --git a/scm/music-functions.scm b/scm/music-functions.scm index 75e6da5349..b75709bf0c 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -718,11 +718,6 @@ duration is replaced with the specified @var{duration}." (define (keep-element? m) (any (lambda (t) (music-is-of-type? m t)) event-types)) - (define origin (ly:music-property repeat-chord 'origin #f)) - (define (set-origin! l) - (if origin - (for-each (lambda (m) (set! (ly:music-property m 'origin) origin)) l)) - l) (for-each (lambda (field) @@ -736,16 +731,17 @@ duration is replaced with the specified @var{duration}." ;; now treat the elements (set! (ly:music-property repeat-chord 'elements) (let ((elts - (set-origin! (ly:music-deep-copy - (filter keep-element? - (ly:music-property original-chord - 'elements)))))) + (ly:music-deep-copy (filter keep-element? + (ly:music-property original-chord + 'elements)) + repeat-chord))) (for-each (lambda (m) (let ((arts (ly:music-property m 'articulations))) (if (pair? arts) (set! (ly:music-property m 'articulations) - (set-origin! (filter! keep-element? arts)))) + (ly:set-origin! (filter! keep-element? arts) + repeat-chord))) (if (ly:duration? (ly:music-property m 'duration)) (set! (ly:music-property m 'duration) duration)) (if (ly:music-property m 'cautionary #f) @@ -760,7 +756,7 @@ duration is replaced with the specified @var{duration}." (if (pair? arts) (set! (ly:music-property repeat-chord 'articulations) (append! - (set-origin! (ly:music-deep-copy arts)) + (ly:music-deep-copy arts repeat-chord) (ly:music-property repeat-chord 'articulations))))) repeat-chord) -- 2.39.5