r3wp [groups: 83 posts: 189283]
  • Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

World: r3wp

[I'm new] Ask any question, and a helpful person will try to answer.

Maxim
23-Jun-2009
[3083]
yep, that's the online version of it.
BrianH
23-Jun-2009
[3084]
OK, here's what happens: The next recognized pattern is COPY/part'ed 
and assigned to the variable. If the length of the matched pattern 
is 0, #[none] is assigned to the variable.
mhinson
23-Jun-2009
[3085x2]
Yes, I have read it a lot, but it seems more of a reference for people 
who already know, rather then an explanation of Parse operations.
Thanks BrianH, I was sort of guessing it must be like a variation 
of copy thru "x" that does not skip like thru...  I think I get that 
now. Thanks.
BrianH
23-Jun-2009
[3087x2]
Note that the assignement to the variable happens *after* the pattern 
is recognized, so any code inside the pattern that references the 
value of the variable will get the old value. Like this:
>> x: "old"
== "old"
>> parse "new" [copy x ["new" (print x)] (print x)]
old
new
== true
The same goes for the set operation of block parsing.
mhinson
23-Jun-2009
[3089]
That is pretty important! I had not realised that before & this copuld 
account for some of the unpredictable behaviour I get.. I thought 
the patern was complete at your first print statement.   These [] 
have lots of subtle influence.
BrianH
23-Jun-2009
[3090]
[ and ] are a grouping construct.
mhinson
23-Jun-2009
[3091]
This is my nemisis. I can't understand how this prints XXXX then 
XX , not XX  three times.  It seems to have a will of its own.

parse/all { X X  XX X X} [some[[copy x "X" (prin x) [copy y "X" (print 
y) | skip] | skip]]]    
I have been stuck on this (in various forms) for over a week now
BrianH
23-Jun-2009
[3092]
Well first of all, you have an extra [ ] in there, just after the 
some.
mhinson
23-Jun-2009
[3093x2]
My thinking is that I expect the inner copy to be executed after 
the first "X" is found, then come back out of the inner bit when 
the next "X" is found.
oops.. my bad with the extra [ ]    I keep trying all sorts & that 
got left behind.
BrianH
23-Jun-2009
[3095x2]
parse/all { X X  XX X X} [some [copy x "X" (prin x) [copy y "X" (print 
y) | skip] | skip]]

Character at a time:
- the outer skip
- copy x "X" (prin x)
- the inner skip
- copy x "X" (prin x)
- the inner skip
- the outer skip
- copy x "X" (prin x)
- copy y "X" (print y)
- the outer skip
- copy x "X" (prin x)
- the inner skip
- copy x "X" (prin x)
- the outer skip

Try this:

>> parse/all { X X  XX X X} [some [copy x "X" (prin x) [copy y "X" 
(print y) | skip (prin "i")] | skip (prin "o")]]
oXiXioXX
oXiXo== true
Now that last outer skip seems to me that it should be an inner skip, 
but I am clearly wrong :(
mhinson
23-Jun-2009
[3097]
Ah. that is a good trick to print i & o with the skips, this will 
help a lot, thanks.

Isee from your analysis that my error is to expect the inner skip 
to skip back to the beginning of that loop...  not sure why I expected 
that, but it is clearly wrong. I dont know if there is a way to make 
the inner loop behave like that, at an earlier point I did hve OPT 
in front of it...  I will be able to make progress with my experiments 
now armed with the new trick you have taught me, but for now I have 
to go & get some sleep I am afraid.  Thanks again.
BrianH
23-Jun-2009
[3098x2]
>> parse/all { X X  XX X X} [(prin 'a) some [(prin 'b) "X" (prin 
'c) [(prin 'd) "X" (print 'e) | (prin 'f) skip (prin 'g)] (prin 'h) 
| (prin 'i) skip (prin 'j)] (prin 'k)]
abijbcdfghbcdfghbijbcde
hbijbcdfghbcdfijbik== true
Now the fij is a bug in parse - it should be fgh.
sqlab
24-Jun-2009
[3100x2]
Excuse, if I did confuse you with my examples-

I just tried to show you that you can get loops with an definite 
loop counter in parse.
regarding 

parse/all "fd doixx s x x x oie    x } " [some [copy d   "x" (print 
d) | skip]]
what did you expect?

If you know what you are looking for you can extend it to


parse/all "fd doixx s x x x oie    x } " [some [copy d   ["x"   | 
"y" | "z" ]    (print d) | skip]]
and you will get your searched values.

But maybe I just don't understand the problem.
mhinson
24-Jun-2009
[3102x4]
Thanks Brian, I am finaly getting it I think. the prin 'a etc is 
better than debugging techniquies I have tried because it is small 
and dosen't add too much to the complexity, I can see I could reduce 
this method further with something like a: does [prin 'a]
Thanks sqlab, no need to excuse yourself please, your examples are 
great & I learnt a new use for COPY in PARSE. This has made your 
examples clear to me now, so thanks for spending your time helping 
me.  


The problem I have set myself is purely to understand parse more 
clearly so I have enough know-how to write any scripts I need without 
spending all day doing it. That is why I start off anking one question, 
then jump to another question if I don't fully understand the help 
I get.  


I have used parse a fair bit all ready, but limited myself to very 
simple concepts. see http://www.rebol.org/script-information.r?script-name=cisco-extract.r
and marvel that it even works ;-)   Thanks.
I have been reminded that   |skip   is a word  | skip   is OR skip. 
 it is so easy to miss the space between | & skip
Right, I would say that the following snippit is the most educational 
thing I have done with PARSE.  It shows me a lot of things about 
what is happening & validates the construction and use of charsets 
& whatever the 'address block is called.     Thanks everyone for 
your help.

digit: charset [#"0" - #"9"]
address: [1 3 digit "." 1 3 digit "." 1 3 digit "." 1 3 digit]

a: does [prin 'a] b: does [prin 'b] c: does [prin 'c] d: does [prin 
'd] e: does [prin 'e] f: does [prin 'f]
parse/all {1 23 4.5.6.12 222.1.1.1 7 8} [some[

 (a) copy x address (prin x) some[ (b) copy y address break | skip 
 (c)] (print y) | skip (d)
]]
adadadadada4.5.6.12bcb222.1.1.1
Graham
24-Jun-2009
[3106x2]
why not use block parsing?
parse [ 1 23 4.5.6.12 222.1.1.1 7 8 ] [ integer! integer! tuple! 
tuple! integer! integer! ]
BrianH
24-Jun-2009
[3108]
Because he's parsing Cisco config files.
mhinson
24-Jun-2009
[3109]
I am just learning everything I can, so knowing about Block Parsing 
sounds good to. tuples! are quite good for IP addresses, but ip addresses 
often need exactly 4 parts. I wonder why there are no datatypes specific 
for networking? e.g. networks & masks & inverse masks and domain 
names. and DNS records.
Steeve
24-Jun-2009
[3110]
Mhinsob, if you load an ip address (from a string) you got a tuple, 
so what is different in your request ?
>> type? probe load "1.2.3.4" 
1.2.3.4
== tuple!
Izkata
24-Jun-2009
[3111]
Possibly checking that it's a valid IP address?
>> length? 1.2.3.4
== 4
>> length? 1.2.3.4.5
== 5
>> length? 1.2.3.44.5
== 5
Tomc
24-Jun-2009
[3112]
early tuples were more restrictive if I recall  (max of lenght 4) 
but then we complained we wanted to use them for more than just networking
BrianH
24-Jun-2009
[3113x2]
You can use up to 10 tuple elements - any higher wouldn't fit into 
an immediate value.
I wonder why there are no datatypes specific for networking?

In general we like our types to be more widely applicable. However, 
we have tuple!, url!, and port!. The rest can be handled by functions.
Paul
24-Jun-2009
[3115x3]
mhinson, not sure if your using R2 or R3 but if your using R2 then 
you might want to know about get-modes.
>> get-modes tcp:// 'interfaces
== [make object! [
        name: "lo0"
        addr: 127.0.0.1
        netmask: 255.0.0.0
        broadcast: none
        dest-addr...
>> print get-modes tcp:// 'interfaces
name: "lo0"
addr: 127.0.0.1
netmask: 255.0.0.0
broadcast: none
dest-addr: none
flags: [multicast loopback]
name: "if15"
addr: 169.254.102.14
netmask: 255.255.0.0
broadcast: 169.254.255.255
dest-addr: none
flags: [broadcast multicast]
name: "if12"
addr: 192.168.1.105
netmask: 255.255.255.0
broadcast: 192.168.1.255
dest-addr: none
flags: [broadcast multicast]
I don't know what the equivalent in R3 is.
BrianH
24-Jun-2009
[3118]
Nothing yet :(
mhinson
25-Jun-2009
[3119]
The get-modes looks interesting. Can it produce information about 
any ip address I might give it?  like 172.22.37.55/28 

I suppose that is an example of a very common network address "type"
BrianH
26-Jun-2009
[3120]
GET-MODES gets information about ports, not addresses.
mhinson
26-Jun-2009
[3121]
Hi. is there a special function to remove the last element of a string 
please? this works, but seems a bit cryptic.
reverse next reverse {a.b.c.}        Thanks.
Sunanda
26-Jun-2009
[3122]
These avoids the double reversal -- not sure if they are less cryptic:
     head clear  back tail  {a.b.c.}
     head remove back tail {a.b.c.}
mhinson
26-Jun-2009
[3123]
Thanks Sunanda. I like clear back tail {a.b.c.}  then I can directly 
modify my string.
Gregg
28-Jun-2009
[3124]
Wrapping it in a func makes it less cryptic. :-)
mhinson
4-Jul-2009
[3125]
Hi. If I obtain a date from a file and it is a DATE!  what is in 
that date?  for example I know it contains date/month, but can I 
get it to return the month as a string with a leading 0 or anything 
like that?  Or is it up to me to code the formatting I need from 
integer date values? Is this documented anywhere or can I see any 
of the source some how.  Thanks.
BrianH
4-Jul-2009
[3126]
There are no built-in date formatting functions that do that. However, 
I'm sure the REBOL.org script library has one :)
mhinson
4-Jul-2009
[3127]
Hi Brian, I see some goodies there. What I am doing is too trivial 
to want to link any large blocks of code just for that so I will 
just code the bit I need I think.  I was puzzled because DATE returns 
the info with the month as  a word, but date/month returns an integer, 
so I imagined there must me more to DATE! than just a structure containing 
integers?
Ladislav
4-Jul-2009
[3128x2]
documented: do you mean like date/month date/day, etc?
http://www.rebol.com/docs/core23/rebolcore-16.html#section-3.2
mhinson
4-Jul-2009
[3130]
Hi Ladislav, yes. or any other bits of information attached to dtae 
types
Ladislav
4-Jul-2009
[3131x2]
(I found a couple of errors in the text)
seems, it was changed recently