On Wednesday 17 May 2006 19:28, Erik Sandberg wrote:
> On Wednesday 17 May 2006 17:31, Han-Wen Nienhuys wrote:
> > Erik Sandberg schreef:
> > > The next step in parser split-up is to move rules out to Scheme. There
> > > will be a lot of functions, so I suggest we create a new make-music.scm
> > > for this.
> >
> > Regarding naming, we already have a make-foo-music for plain SCM use.
>
> I suppose however that it would be useful for scheme users to get access to
> all the syntax functions (make-syntax-simultaneous will be very similar to
> make-simultaneous-music, for instance). It could at least be good to let
> make-*-music be wrappers around syntax expressions, or vice versa.
>
> > I
> > propose to have
> >
> >   foo:  bar baz
> >      ;
> >
> >
> > =>
> >
> >    (make-syntax-foo .. )

I realised that there's a thinko in this naming convention: 
(make-syntax-foo ...) _is_ a syntax expression, and it _makes_ a music 
expression. 

If we use a separate module for syntax expressions, why not just say foo? 
e.g.:
(sequential-music .. )
for a syntax expression that represents (and, incidentally, produces music 
which represents) sequential music.

A patch for sequential, simultaneous and repeated music is attached. No fancy 
module tricks are used yet, but everything is done through macros that can be 
changed.

> One idea to connect both is to use some C++ macro and SCM initialization
> trickery, to register each MAKE_SYNTAX_EXPRESSION with the Lily_parser
> class, and provide a
>
>    (ly:parser-set-syntax 'music-sequence my-music-sequencer)

I don't understand. Why would the parser be interested in knowing which syntax 
functions that exist? AFAICS it should be sufficient for the parser to just 
evaluate the top-level syntax expression in the ly-syntax-constructurs module 
(so knowing about that module should be sufficient). The lexer needs to know 
about user-defined music functoins and macros of course, but those mechanisms 
do already exist.

-- 
Erik
? build-stamp
? context-unique.diff
? def-rel-music-funciton.diff
? delay-music-functions.diff
? exjobb.diff3
? fonts
? lib
? lilypond.kdevelop
? lilypond.kdevelop.pcs
? lilypond.kdevses
? optimized
? ref1.diff
? ref2.diff
? repeat.diff
? scons.cache
? Documentation/out
? Documentation/out-www
? Documentation/bibliography/out
? Documentation/bibliography/out-www
? Documentation/misc/out
? Documentation/misc/out-www
? Documentation/pictures/out
? Documentation/pictures/out-www
? Documentation/topdocs/out
? Documentation/topdocs/out-www
? Documentation/user/out
? Documentation/user/out-www
? buildscripts/out
? buildscripts/out-www
? cygwin/out
? cygwin/out-www
? debian/out
? elisp/out
? elisp/out-www
? flower/out
? flower/out-scons
? flower/out-www
? flower/include/.sconsign
? flower/include/out
? flower/include/out-www
? input/Diagram1.dia.autosave
? input/les-nereides.pdf
? input/les-nereides.ps
? input/out
? input/out-www
? input/mutopia/out
? input/mutopia/out-www
? input/mutopia/E.Satie/out
? input/mutopia/E.Satie/out-www
? input/mutopia/F.Schubert/out
? input/mutopia/F.Schubert/out-www
? input/mutopia/J.S.Bach/out
? input/mutopia/J.S.Bach/out-www
? input/mutopia/R.Schumann/out
? input/mutopia/R.Schumann/out-www
? input/mutopia/W.A.Mozart/out
? input/mutopia/W.A.Mozart/out-www
? input/no-notation/out
? input/no-notation/out-www
? input/no-notation/parse-expressions.facit
? input/no-notation/parse-expressions.ly
? input/no-notation/parse-expressions.pdf
? input/no-notation/parse-expressions.ps
? input/no-notation/to-xml.pdf
? input/no-notation/to-xml.ps
? input/regression/chord-tremolo.pdf
? input/regression/chord-tremolo.ps
? input/regression/lyric-melisma-manual.pdf
? input/regression/lyric-melisma-manual.ps
? input/regression/lyrics-melisma-beam.pdf
? input/regression/lyrics-melisma-beam.ps
? input/regression/out
? input/regression/out-www
? input/regression/tuplet-nest.pdf
? input/regression/tuplet-nest.ps
? input/template/out
? input/test/out
? input/test/out-www
? input/tutorial/out
? input/tutorial/out-www
? kpath-guile/out
? kpath-guile/out-scons
? lily/On
? lily/foo.pdf
? lily/foo.ps
? lily/lilypond
? lily/lilypond.gdt
? lily/lilypond.gpr
? lily/out
? lily/out-scons
? lily/out-www
? lily/parser.yy.ok
? lily/include/.sconsign
? lily/include/out
? lily/include/out-www
? ly/out
? ly/out-www
? make/out
? make/out-www
? mf/feta-alphabet11.600pk
? mf/feta-alphabet13.600pk
? mf/feta-alphabet14.600pk
? mf/feta-alphabet16.600pk
? mf/feta-alphabet18.600pk
? mf/feta-alphabet20.600pk
? mf/feta-alphabet23.600pk
? mf/feta-alphabet26.600pk
? mf/feta-braces-a.600pk
? mf/feta-braces-b.600pk
? mf/feta-braces-c.600pk
? mf/feta-braces-d.600pk
? mf/feta-braces-e.600pk
? mf/feta-braces-f.600pk
? mf/feta-braces-g.600pk
? mf/feta-braces-h.600pk
? mf/feta-braces-i.600pk
? mf/feta11.600pk
? mf/feta13.600pk
? mf/feta14.600pk
? mf/feta16.600pk
? mf/feta18.600pk
? mf/feta20.600pk
? mf/feta23.600pk
? mf/feta26.600pk
? mf/out
? mf/out-scons
? mf/out-www
? mf/parmesan11.600pk
? mf/parmesan13.600pk
? mf/parmesan14.600pk
? mf/parmesan16.600pk
? mf/parmesan18.600pk
? mf/parmesan20.600pk
? mf/parmesan23.600pk
? mf/parmesan26.600pk
? po/out
? po/out-www
? ps/out
? ps/out-www
? python/convertrules.pyc
? python/fontextract.pyc
? python/lilylib.pyc
? python/out
? python/out-www
? scm/ly-syntax-constructors.scm
? scm/out
? scm/out-www
? scripts/lilypond-book-36.py
? scripts/lilypond-book.py.new
? scripts/out
? scripts/out-www
? stepmake/out
? stepmake/out-www
? stepmake/bin/out
? stepmake/bin/out-www
? stepmake/bin/packagepython.pyc
? stepmake/stepmake/out
? stepmake/stepmake/out-www
? tex/out
? tex/out-www
? ttftool/out
? ttftool/out-scons
? ttftool/include/.sconsign
? ttftool/include/out
? vim/out
? vim/out-www
Index: lily/parser.yy
===================================================================
RCS file: /sources/lilypond/lilypond/lily/parser.yy,v
retrieving revision 1.514
diff -u -r1.514 parser.yy
--- lily/parser.yy	17 May 2006 17:30:48 -0000	1.514
+++ lily/parser.yy	18 May 2006 11:25:17 -0000
@@ -111,8 +111,12 @@
 
 #define MY_MAKE_MUSIC(x)  make_music_by_name (ly_symbol2scm (x))
 
-#define MAKE_SYNTAX_EXPRESSION(name, ...)	\
-  scm_apply_0 (ly_lily_module_constant (name), scm_list (__VA_ARGS__, SCM_UNDEFINED));
+/* ES TODO:
+- Don't use lily module, create a new module instead.
+- delay application of the function
+*/
+#define MAKE_SYNTAX(name, location, ...)	\
+  scm_apply_0 (ly_lily_module_constant (name), scm_list_n (make_input (location), __VA_ARGS__, SCM_UNDEFINED));
 
 Music *property_op_to_music (SCM op);
 SCM context_spec_music (SCM type, SCM id, SCM m, SCM ops, bool create_new);
@@ -872,48 +876,30 @@
 Repeated_music:
 	REPEAT simple_string bare_unsigned Music Alternative_music
 	{
-		SCM proc = ly_lily_module_constant ("make-repeat");
-		SCM alts = scm_is_pair ($5) ? scm_car ($5) : SCM_EOL;
-		assert (unsmob_music ($4));
-		SCM mus = scm_call_4 (proc, $2, scm_int2num ($3), $4, alts);
-		Music *r = unsmob_music (mus);
-		r->set_spot (*unsmob_music($4)->origin ());
-		$$ = mus;
+		$$ = MAKE_SYNTAX ("repeat", @$, $2, $3, $4, $5);
 	}
 	;
 
 Sequential_music:
 	SEQUENTIAL '{' Music_list '}'		{
-		Music *m = MY_MAKE_MUSIC ("SequentialMusic");
-		m->set_property ("elements", scm_car ($3));
-		m->set_spot (@$);
-		$$ = m->unprotect ();
+		$$ = MAKE_SYNTAX ("sequential-music", @$, scm_car ($3));
 	}
 	| '{' Music_list '}'		{
-		Music *m = MY_MAKE_MUSIC ("SequentialMusic");
-		m->set_property ("elements", scm_car ($2));
-		m->set_spot (@$);
-		$$ = m->unprotect ();
+		$$ = MAKE_SYNTAX ("sequential-music", @$, scm_car ($2));
 	}
 	;
 
 Simultaneous_music:
 	SIMULTANEOUS '{' Music_list '}'{
-		Music *m = MY_MAKE_MUSIC ("SimultaneousMusic");
-		m->set_property ("elements", scm_car ($3));
-		m->set_spot (@$);
-		$$ = m->unprotect ();
+		$$ = MAKE_SYNTAX ("simultaneous-music", @$, scm_car ($3));
 	}
 	| simul_open Music_list simul_close	{
-		Music *m = MY_MAKE_MUSIC ("SimultaneousMusic");
-		m->set_property ("elements", scm_car ($2));
-		m->set_spot (@$);
-		$$ = m->unprotect ();
+		$$ = MAKE_SYNTAX ("simultaneous-music", @$, scm_car ($2));
 	}
 	;
 
 Simple_music:
-	event_chord		{ $$ = $1; }
+	event_chord
 	| MUSIC_IDENTIFIER
 	| music_property_def
 	| context_change
Index: scm/lily.scm
===================================================================
RCS file: /sources/lilypond/lilypond/scm/lily.scm,v
retrieving revision 1.397
diff -u -r1.397 lily.scm
--- scm/lily.scm	16 May 2006 11:30:55 -0000	1.397
+++ scm/lily.scm	18 May 2006 11:25:17 -0000
@@ -245,6 +245,7 @@
 	    "chord-name.scm"
 
 	    "parser-ly-from-scheme.scm"
+	    "ly-syntax-constructors.scm"
 	    
 	    "define-context-properties.scm"
 	    "translation-functions.scm"
;;;; define-syntax.scm -- Defines functions for syntax expressions
;;;;
;;;;  source file of the GNU LilyPond music typesetter
;;;; 
;;;; (c) 2006 Erik Sandberg <[EMAIL PROTECTED]>

;; TODO: use separate module for parser.
(define define-syntax define-public)

;; This shorthand adds a location parameter, and uses it to set the
;; origin. It can be used for most music functions.
(defmacro define-syntax-loc (args . body)
  (primitive-eval `(define-syntax ,(cons* (car args) 'location (cdr args))
                     (let ((m ((lambda ,(cdr args) . ,body) . ,(cdr args))))
                       (set! (ly:music-property m 'origin) location)
                       m))))

(define-syntax-loc (sequential-music mlist)
  (make-sequential-music mlist))

(define-syntax-loc (simultaneous-music mlist)
  (make-simultaneous-music mlist))

(define-syntax-loc (repeat type num body alts)
  (make-repeat type num body alts))
_______________________________________________
lilypond-devel mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/lilypond-devel

Reply via email to