lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Let the parser interpret alist variables (issue 290560043 by address


From: dak
Subject: Re: Let the parser interpret alist variables (issue 290560043 by address@hidden)
Date: Mon, 14 Mar 2016 08:32:05 +0000

Reviewers: thomasmorley651, lemzwerg,


https://codereview.appspot.com/290560043/diff/1/lily/nested-property.cc
File lily/nested-property.cc (right):

https://codereview.appspot.com/290560043/diff/1/lily/nested-property.cc#newcode137
lily/nested-property.cc:137: for (;scm_is_pair (prop_path); prop_path =
scm_cdr (prop_path))
On 2016/03/14 06:46:51, lemzwerg wrote:
s/;scm/; scm/

Done.  Not uploading a separate review just for this, however.

Description:
Let the parser interpret alist variables

After

x.y = { c d e f }

this allows using

\x.y

instead of #(assoc-ref x 'y) in most places where the latter would work.


Also contains commit:

Create nested_property function

Please review this at https://codereview.appspot.com/290560043/

Affected files (+33, -1 lines):
  M lily/include/context.hh
  M lily/nested-property.cc
  M lily/parser.yy


Index: lily/include/context.hh
diff --git a/lily/include/context.hh b/lily/include/context.hh
index c4af7bce0579255dea4919f034065a00b3640bf8..ab89593d1bbad317b38de9e5b58a865224bc085b 100644
--- a/lily/include/context.hh
+++ b/lily/include/context.hh
@@ -193,6 +193,7 @@ void set_context_property_on_children (Context *trans, SCM sym, SCM val);
   } while (0)

 SCM nested_property_alist (SCM alist, SCM prop_path, SCM value);
+SCM nested_property (SCM alist, SCM prop_path, SCM fallback = SCM_EOL);
 SCM nested_create_alist (SCM prop_path, SCM value);
 SCM partial_list_copy (SCM alist, SCM tail, SCM newtail);
 SCM assq_tail (SCM key, SCM alist, SCM alist_end);
Index: lily/nested-property.cc
diff --git a/lily/nested-property.cc b/lily/nested-property.cc
index 7c8b13047d726e8f8d45fc2e44300402e038d31a..514935a93cf73bb070e43a83c9b52d6328244749 100644
--- a/lily/nested-property.cc
+++ b/lily/nested-property.cc
@@ -131,6 +131,19 @@ nested_property_alist (SCM alist, SCM prop_path, SCM value)
   return scm_acons (key, value, alist);
 }

+SCM
+nested_property (SCM alist, SCM prop_path, SCM fallback)
+{
+  for (;scm_is_pair (prop_path); prop_path = scm_cdr (prop_path))
+    {
+      SCM tail = assoc_tail (scm_car (prop_path), alist);
+      if (scm_is_false (tail))
+        return fallback;
+      alist = scm_cdar (tail);
+    }
+  return alist;
+}
+
 void
 set_nested_property (Grob *me, SCM big_to_small, SCM value)
 {
Index: lily/parser.yy
diff --git a/lily/parser.yy b/lily/parser.yy
index 29ecf1c3222f88e4d8a7b6325486d24c098fa605..62cf8301e34fa54b03f656d0a31bfb49fcc72bc4 100644
--- a/lily/parser.yy
+++ b/lily/parser.yy
@@ -119,6 +119,7 @@ FIXME:
 using namespace std;

 #include "book.hh"
+#include "context.hh"
 #include "context-def.hh"
 #include "context-mod.hh"
 #include "dimensions.hh"
@@ -353,6 +354,7 @@ If we give names, Bison complains.
 %token EVENT_IDENTIFIER
 %token EVENT_FUNCTION
 %token FRACTION
+%token LOOKUP_IDENTIFIER
 %token LYRIC_ELEMENT
 %token MARKUP_FUNCTION
 %token MARKUP_LIST_FUNCTION
@@ -492,6 +494,15 @@ toplevel_expression:
        }
        ;

+lookup:
+       LOOKUP_IDENTIFIER
+       | LOOKUP_IDENTIFIER '.' symbol_list_rev
+       {
+               $$ = loc_on_music (parser, @$,
+                                  nested_property ($1, scm_reverse_x ($3, 
SCM_EOL)));
+       }
+       ;
+
 embedded_scm_bare:
        SCM_TOKEN
        {
@@ -503,6 +514,7 @@ embedded_scm_bare:
 embedded_scm_active:
        SCM_IDENTIFIER
        | scm_function_call
+       | lookup
        ;

 embedded_scm_bare_arg:
@@ -520,6 +532,7 @@ embedded_scm_bare_arg:
        | book_block
        | bookpart_block
        | output_def
+       | lookup
        ;

 /* The generic version may end in music, or not */
@@ -527,6 +540,7 @@ embedded_scm_bare_arg:
 embedded_scm:
        embedded_scm_bare
        | scm_function_call
+       | lookup
        ;

 /* embedded_scm_arg is _not_ casting pitches to music by default, this
@@ -4034,8 +4048,12 @@ Lily_lexer::try_special_identifiers (SCM *destination, SCM sid)
        } else if (unsmob<Score> (sid)) {
                *destination = unsmob<Score> (sid)->clone ()->unprotect ();
                return SCM_IDENTIFIER;
+       } else if (scm_is_pair (sid)
+                  && scm_is_pair (scm_car (sid))
+                  && scm_is_symbol (scm_caar (sid))) {
+               *destination = sid;
+               return LOOKUP_IDENTIFIER;
        }
-
        return -1;
 }






reply via email to

[Prev in Thread] Current Thread [Next in Thread]