[REBOL] Re(2): 'parse trick and 'unset
From: arolls::bigpond::net::au at: 17-Dec-2000 3:34
Change 'id, so that the full code is:
digits: charset "0123456789"
id: ["<" 3 4 digits ">"]
rule: [a: some [id | [skip b:]] (print copy/part a b)]
parse line1 rule
parse line2 rule
> > Try this out:
> > line1: "Ju<li>e<><><<1234>"
> > id: [thru "<" 3 4 digits ">"]
> > rule: [a: some [id | [skip b:]] (print copy/part a b)]
> > parse line1 rule
> Nice trick, I would never have thought of it. It will really be useful for
> 'extract rule checking (see my last post). I was surprised by the
> results of
> the following test though:
> >> parse line1 rule
> == true
> >> line2: "Jules<1234>ffg<5678>"
> == "Jules<1234>ffg<5678>"
> >> parse line2 rule
> ** Script Error: Invalid /part count: <1234>.
> ** Where: print copy/part a b
> Weird. After some stuffing around I discovered this was because
> 'a and 'b were
> still defined from the last operation, so the values need to be
> cleared. This
> is apparently not as easy as it would seem:
That's not the reason.
The reason is because parsing line2 didn't ever set 'b.
'b was still set to point to line1, with the index
Why? Because in 'line2 we instantly found 2 id's and
got to the end in two steps. That's because id
began with [thru ">" ...], which means "jump through
all input until after the first ">".
This happens twice and we're finished already.
Remove the 'thru, and 'id is defined more precisely.
> Finally Anton, your trick always returns true, even if it didn't
> find the id
> line1: "Ju<li>e<><><<no-id-here>"
> parse line1 rule
> == true
> So I'll have to redefine 'rule:
> parse line1 rule: [a: (success: false) some [id (success: true)|
> [skip b:]]
> (print copy/part a b)]
> if success [do something]
That's a good idea.