On 07/22/2014 03:09 PM, orchidaceae phalaenopsis wrote:
Sorry to say but I could not continue to build my BBCode parser, I
added a new combinator:

fun choice [a] (p : parser a) (q : parser a) : parser a =
     fn input =>  case p input of
                     Empty Failure =>  q input
                   | Empty ok =>  (case q input of
                                      Empty _ =>  Empty ok
                                    | consumed =>  consumed)
                   | consumed =>  consumed

and

val bbid : parser bbtag =
     choice
         (_<- char #"b" ; return B)
         (_<- char #"u" ; return U)

triggers the anonymous function problem.

Can you point me to a full program demonstrating this problem? I added your snippets to the version I sent before, in what seemed like the natural way, and a simple test case worked fine.

Also to simulate lazy evaluation (which is essential in this parser),
I will need to change

     datatype consumed a = Consumed of reply a
                         | Empty of reply a

to delay the replies

     datatype consumed a = Consumed of unit ->  reply a
                         | Empty of unit ->  reply a

later on. These are higher order objects that I don't think could be
removed completely during compiling?

Yes, you won't be able to use that sort of parser type in server-side code. It should work fine in client-side code, though, just as your original example should work fine there, AFAIK.

Why do you want lazy evaluation? Can you give a minimal example demonstrating the need?

_______________________________________________
Ur mailing list
[email protected]
http://www.impredicative.com/cgi-bin/mailman/listinfo/ur

Reply via email to