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