music-transformation functions.
+2004-05-05 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * lily/parser.yy (Generic_prefix_music): allow generic
+ music-transformation functions.
+
+ * lily/include/music-head.hh (is_music_head): new file.
+
+ * lily/music-head.cc (get_music_head_transform): new file.
+
2004-05-04 Han-Wen Nienhuys <hanwen@xs4all.nl>
* lily/ottava-bracket.cc (print): use coordinate, not (0,0) for
#include <iostream>
using namespace std;
-
+#include "music-head.hh"
#include "source-file.hh"
#include "parse-scm.hh"
#include "lily-guile.hh"
void strip_trailing_white (String&);
void strip_leading_white (String&);
String lyric_fudge (String s);
-
+int music_head_type (SCM);
SCM lookup_markup_command (String s);
bool is_valid_version (String s);
return l;
}
SCM sid = lookup_identifier (str);
+ if (is_music_head (sid))
+ {
+ yylval.scm = get_music_head_transform (sid);
+ return music_head_type (yylval.scm);
+ }
+
if (sid != SCM_UNDEFINED)
{
yylval.scm = sid;
SCM proc = ly_scheme_function ("lookup-markup-command");
return scm_call_1 (proc, scm_makfrom0str (s.to_str0 ()));
}
+
+
+int
+music_head_type (SCM func)
+{
+ SCM type= scm_object_property (func, ly_symbol2scm ("music-head-signature"));
+ if (type == ly_symbol2scm ("scm"))
+ {
+ return MUSIC_HEAD_SCM;
+ }
+ else if (type == ly_symbol2scm ("music"))
+ {
+ return MUSIC_HEAD_MUSIC;
+ }
+ else if (type == ly_symbol2scm ("scm-music"))
+ {
+ return MUSIC_HEAD_SCM_MUSIC;
+ }
+ else if (type == ly_symbol2scm ("scm-music-music"))
+ {
+ return MUSIC_HEAD_SCM_MUSIC_MUSIC;
+ }
+ else if (type == ly_symbol2scm ("scm-scm-music"))
+ {
+ return MUSIC_HEAD_SCM_SCM_MUSIC;
+ }
+ else
+ assert (false);
+
+ return MUSIC_HEAD_SCM_MUSIC_MUSIC;
+}
%token <scm> MARKUP_HEAD_SCM0_SCM1_SCM2
%token <scm> MARKUP_HEAD_SCM0_SCM1_MARKUP2
+%token <scm> MUSIC_HEAD_SCM
+%token <scm> MUSIC_HEAD_MUSIC
+%token <scm> MUSIC_HEAD_SCM_MUSIC
+%token <scm> MUSIC_HEAD_MUSIC_MUSIC
+%token <scm> MUSIC_HEAD_SCM_SCM_MUSIC
+%token <scm> MUSIC_HEAD_SCM_MUSIC_MUSIC
+
%token <scm> MARKUP_IDENTIFIER MARKUP_HEAD_LIST0
%type <scm> markup markup_line markup_list markup_list_body full_markup
%type <i> sub_quotes sup_quotes
%type <music> toplevel_music
%type <music> simple_element event_chord command_element
-%type <music> Composite_music Simple_music Prefix_composite_music
+%type <music> Composite_music Simple_music Prefix_composite_music Generic_prefix_music
%type <music> Grouped_music_list
%type <music> Repeated_music
%type <scm> Alternative_music
Simultaneous_music { $$ = $1; }
| Sequential_music { $$ = $1; }
;
-
+
+Generic_prefix_music:
+ MUSIC_HEAD_SCM { THIS->push_spot (); } embedded_scm {
+ SCM m = scm_call_2 ($1, make_input (THIS->pop_spot ()),
+ $3);
+ if (unsmob_music (m))
+ $$ = unsmob_music (m);
+ else
+ {
+ THIS->parser_error ("MUSIC_HEAD should return Music");
+ $$ = MY_MAKE_MUSIC("Music");
+ }
+ }
+ ;
+
Prefix_composite_music:
- AUTOCHANGE Music {
+ Generic_prefix_music {
+ $$ = $1;
+ }
+ |AUTOCHANGE Music {
SCM proc = ly_scheme_function ("make-autochange-music");
SCM res = scm_call_1 (proc, $2->self_scm ());