Hi,

syntax-parse is quite a heavy where it basically defines a syntax-case +
verifying logic from the beginning.

What I have played with a lighter version of that code and a kind of system
around it that worked by
piggy-pack on guiles syntax-case.

It's not much code needed to get something that is acceptable for my uses
here so this is what I did.

I redefined matchers so that one could enter validators inside the matcher
like

(syntax-parse x () ((_ x y : list-of-symbols) #'(cons x y)))

If you did not have this information you would use syntax-case and write a
verifier-function (list-of-symbols)
that is called in the first possition and send #'(x y) as the first
argument to this function. This is what I
basically do as well.

So the gain is a clearer specification of what is allowed in the matcher.
So not much logic here
to meet my humble need. The code does get significantly more self
documented by this though.

I did try to get line-numbers in the error outputs but I somehow failed to
do this correctly right now I just
get the function location where the error appear.

I have used this system quite alot and are found of it. And I strongly
advocate to enter such a system into
guile. You get qute a lot of code readability and code patterns from quite
a limitid amount of code.

I will try to writeup something more meaty the next days' but I hope you
got a feeling for the general
approach I took.

Oh, it really pay's off to write specifications for macros and report on
errors reasonable exact. It really cut's down on debugging time.

Here is an example of how I use it
(define-syntax <const>
  (lambda (x)

    (define <tp>     (mk-type-vd         #t '<const>))
    (define <id>     (mk-identifier-vd   #t '<const>))
    (define <arg3> (mk-arg-vd          #t '<const> 3))

    (reg-form x)

    (syntax-parse x ()
      ((_ (t : <tp>) (s : <id>)  v : <arg3>)
       #'(begin
           (define s (mk-var (auto-type t)
                             (auto-t s)
                             (auto v)
                             'no-gensym))

           (set! *clambda*
                 (cons (c-const (c-var (auto-type t) (s #t) (v #t)))
                       *clambda*)))))))

(t : <tp>)

when there is only one element the the left of : then this is inetrpreted
as (<tp> #'t) but idf we would have
(t1 t2 : <tp>) I would interpret it as (<tp> #'(t1 t2))

Regards
Stefan

On Wed, Nov 23, 2011 at 10:47 PM, Andy Wingo <wi...@pobox.com> wrote:

> On Mon 09 May 2011 14:11, Stefan Israelsson Tampe <stefan.ita...@gmail.com>
> writes:
>
> > Hi, check out guile-syntax-parse at
> > https://gitorious.org/guile-syntax-parse/guile-syntax-parse
>
> How is this going?  Are you still using it?
>
> You didn't get any responses, but I'm still curious to see it working.
> Syntax-parse sounds like a useful facility.  I'm offline at the moment,
> but I would be interested in hearing about your experiences with this.
>
> Cheers,
>
> Andy
> --
> http://wingolog.org/
>

Reply via email to