From: David Kastrup Date: Fri, 25 Sep 2015 07:40:17 +0000 (+0200) Subject: Issue 4620/2: Add ly:pure-call and ly:unpure-call functions X-Git-Tag: release/2.19.29-1~38 X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=commitdiff_plain;h=ebc17304f454a3debdc791e3bc7bb829d8b33b00;p=lilypond.git Issue 4620/2: Add ly:pure-call and ly:unpure-call functions --- diff --git a/lily/unpure-pure-container.cc b/lily/unpure-pure-container.cc index 81bba591e4..0e389d4bcd 100644 --- a/lily/unpure-pure-container.cc +++ b/lily/unpure-pure-container.cc @@ -87,3 +87,40 @@ Unpure_pure_container::print_smob (SCM port, scm_print_state *) const scm_puts (" >", port); return 1; } + +LY_DEFINE (ly_pure_call, "ly:pure-call", + 4, 0, 1, (SCM data, SCM grob, SCM start, SCM end, SCM rest), + "Convert property @var{data} (unpure-pure container or procedure)" + " to value in a pure context defined by @var{grob}," + " @var{start}, @var{end}, and possibly @var{rest} arguments.") +{ + if (Unpure_pure_container *upc = unsmob (data)) + { + // Avoid gratuitous creation of an Unpure_pure_call + if (upc->is_unchanging ()) + data = upc->unpure_part (); + else + { + data = upc->pure_part (); + if (ly_is_procedure (data)) + return scm_apply_3 (data, grob, start, end, rest); + return data; + } + } + if (ly_is_procedure (data)) + return scm_apply_1 (data, grob, rest); + return data; +} + +LY_DEFINE (ly_unpure_call, "ly:unpure-call", + 2, 0, 1, (SCM data, SCM grob, SCM rest), + "Convert property @var{data} (unpure-pure container or procedure)" + " to value in an unpure context defined by @var{grob}" + " and possibly @var{rest} arguments.") +{ + if (Unpure_pure_container *upc = unsmob (data)) + data = upc->unpure_part (); + if (ly_is_procedure (data)) + return scm_apply_1 (data, grob, rest); + return data; +}