]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/unpure-pure-container.cc
Issue 4868/1: Add font-index for embedding OTC fonts
[lilypond.git] / lily / unpure-pure-container.cc
index 81bba591e41a2dbb2da69756ebe7333130698a3f..7a7d6d48d16d3c139aca38ad9f0f38f307b5debb 100644 (file)
@@ -25,6 +25,7 @@
 class Unpure_pure_call : public Smob1<Unpure_pure_call>
 {
 public:
+  static const char * const type_p_name_; // = 0
   // Smob procedures unfortunately can only take at most 3 SCM
   // arguments.  Otherwise we could use a "3, 0, 1" call signature and
   // not require an argument count check of our own.
@@ -37,6 +38,8 @@ public:
   }
 };
 
+const char * const Unpure_pure_call::type_p_name_ = 0;
+
 SCM
 Unpure_pure_container::pure_part () const
 {
@@ -87,3 +90,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<Unpure_pure_container> (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<Unpure_pure_container> (data))
+    data = upc->unpure_part ();
+  if (ly_is_procedure (data))
+    return scm_apply_1 (data, grob, rest);
+  return data;
+}