X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fmusic-scheme.cc;h=55f1333bf5dbb297d3f00426865113b7c6c5a871;hb=0b544cfb7332615ef809b71b57ab656741311ae1;hp=ffa903b4ebedc5d6ead2b34eb08679747f3ab30e;hpb=34fc5bf1293e0bbdea8519118112b50dd1256ac7;p=lilypond.git diff --git a/lily/music-scheme.cc b/lily/music-scheme.cc index ffa903b4eb..55f1333bf5 100644 --- a/lily/music-scheme.cc +++ b/lily/music-scheme.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2005--2012 Han-Wen Nienhuys + Copyright (C) 2005--2014 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -114,18 +114,30 @@ LY_DEFINE (ly_music_list_p, "ly:music-list?", LY_DEFINE (ly_music_deep_copy, "ly:music-deep-copy", 1, 0, 0, (SCM m), - "Copy @var{m} and all sub expressions of@tie{}@var{m}.") + "Copy @var{m} and all sub expressions of@tie{}@var{m}." + " @var{m} may be an arbitrary type; cons cells and music" + " are copied recursively.") { - SCM copy = m; if (unsmob_music (m)) + return unsmob_music (m)->clone ()->unprotect (); + if (scm_is_pair (m)) { - Music *mcopy = unsmob_music (m)->clone (); - copy = mcopy->unprotect (); + SCM copy = SCM_EOL; + do + { + copy = scm_cons (ly_music_deep_copy (scm_car (m)), copy); + m = scm_cdr (m); + } + while (scm_is_pair (m)); + // Oh, come on, GUILE. Why do you require the second argument + // of scm_reverse_x to be a proper list? That makes no sense. + // return scm_reverse_x (copy, ly_music_deep_copy (m)); + SCM last_cons = copy; + copy = scm_reverse_x (copy, SCM_EOL); + scm_set_cdr_x (last_cons, ly_music_deep_copy (m)); + return copy; } - else if (scm_is_pair (m)) - copy = scm_cons (ly_music_deep_copy (scm_car (m)), - ly_music_deep_copy (scm_cdr (m))); - return copy; + return m; } LY_DEFINE (ly_music_transpose, "ly:music-transpose", @@ -170,8 +182,6 @@ LY_DEFINE (ly_make_music_relative_x, "ly:make-music-relative!", Pitch start = *unsmob_pitch (pitch); Music *m = unsmob_music (music); Pitch last = m->to_relative_octave (start); - if (lily_1_8_relative) - m->set_property ("last-pitch", last.smobbed_copy ()); return last.smobbed_copy (); }