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

World: r3wp

[Parse] Discussion of PARSE dialect

Anton
9-Jul-2006
[1310]
Is your code in the second parens actually ever executing ?
Henrik
9-Jul-2006
[1311]
yes, I try to print the variable and it just returns none.
Anton
9-Jul-2006
[1312]
Mmm let me make a few tests.
Henrik
9-Jul-2006
[1313]
actually, there is a difference between my code and this, which may 
be causing it:


I need to loop the block with 'any. I suspect the contents is lost 
after the first run.
Oldes
9-Jul-2006
[1314]
because you set it to none in the first parens
Anton
9-Jul-2006
[1315]
Yes the rule can only fail after the first parens.
Henrik
9-Jul-2006
[1316]
oldes: it makes no difference whether the first parens is left out 
or not
Anton
9-Jul-2006
[1317]
And to answer your question, the variables are just regular rebol 
words, so they are as local as you make them.
Oldes
9-Jul-2006
[1318x2]
and how looks the code you parse?
if the parse is inside function and you set pos in the function as 
a local - it will be local
Henrik
9-Jul-2006
[1320x2]
I'm parsing:

[image "String" image-word [action block]]
where 'image is always first and the remaining items may come in 
random order
Oldes
9-Jul-2006
[1322]
there is no pair and no numbers - the pos must be none
Henrik
9-Jul-2006
[1323]
oldes, my code is different from his. I used his as it's structurally 
similar to mine
Oldes
9-Jul-2006
[1324]
and what exactly do you want?
Henrik
9-Jul-2006
[1325]
I want to assign a variable to each element so I can process them 
later
Oldes
9-Jul-2006
[1326]
so for the block above it would assing what?
Henrik
9-Jul-2006
[1327x3]
the block is stored in 'attr.

parse attr [

  (txt: 123 print txt) 'image any [set txt string! (print txt) | set 
  img word! | set action block!] (print txt) | 'face
]

gives:

123
search
none
== true
argh... forgot to show you attr
attr: [image test-image "Search" [print "test"]]
Oldes
9-Jul-2006
[1330]
Don't you want to use rather:

parse/all attr [(txt: 123 print txt) 'image opt [set txt string! 
(print txt)] opt [ set img word!] opt [ set action block! (print 
txt)] (print txt) | 'face]
Henrik
9-Jul-2006
[1331]
it seems the variable is stored in the last iteration, so it's definitely 
lost after one loop.
Anton
9-Jul-2006
[1332]
Doesn't Henrik want to be able to process the attributes in any order 
?
Henrik
9-Jul-2006
[1333x3]
that's what I want. I'm catching fish :-) or rather information to 
store them safely for processing later.
but let me try Oldes thing to see what it does
it works the exact opposite :-) Only the outer 'txt is set, and I 
can't reach the variable inside the block
Anton
9-Jul-2006
[1336x2]
Henrik, I parse your test attr block successfully:

>> parse [image test-image "Search" [print "action"]] ['image any 
[set txt string! (?? txt) | set img word! | set action block!]]
txt: "Search"
== true
Need more test data to parse.
Henrik
9-Jul-2006
[1338x2]
anton: yes, but what is txt after processing?
I don't want to handle it inside the parse block but after it
Anton
9-Jul-2006
[1340]
it is none.
Henrik
9-Jul-2006
[1341]
right. that's the problem
Anton
9-Jul-2006
[1342x2]
add a block to control the evaluation.
>> parse [image test-image "Search" [print "action"]] ['image any 
[[set txt string! (?? txt)] | set img word! | set action block!]]
txt: "Search"
== true
>> txt
== "Search"
Oldes
9-Jul-2006
[1344]
it always set the variables to none, if it fails to match
Anton
9-Jul-2006
[1345]
You have to be careful in your interpretation of  |
Oldes
9-Jul-2006
[1346]
interesting, this is the solution:

 txt: 123 parse/all attr ['image any [[set txt string! (print txt)] 
 | [set img word!] | [set action block! (print txt)]] (print txt) 
 | 'face]
Henrik
9-Jul-2006
[1347x2]
oldes solution seems to work
the wonders of parse... :-)
Oldes
9-Jul-2006
[1349]
it's just improved anton's solution:-)
Anton
9-Jul-2006
[1350]
I'm trying to figure out a simple example to show why.
Henrik
9-Jul-2006
[1351]
I wonder what the difference is? If it's only for controlling how 
global a variable is, it seems a little backwards to me
Oldes
9-Jul-2006
[1352]
without the extra brackets, the parse set the variables to none if 
it failes
Henrik
9-Jul-2006
[1353]
the brackets would make it a "real" rule, wouldn't it? it would be 
possible to replace the rule with a variable and have the rule block 
placed elsewhere in your code
Anton
9-Jul-2006
[1354]
You have to think of a rule like this:
	[ integer! | ]
as equivalent to
	[ integer! | none ]
or
	opt [ integer! ]
Oldes
9-Jul-2006
[1355]
I don;t know how much complex will be the source to parse, but I 
would use the OPT settings as used above
Anton
9-Jul-2006
[1356x2]
But Henrick wants it in any order, like LAYOUT code. (Thus, it's 
worth to look how LAYOUT works. :)
>> parse ["hi"] [[set num integer! | ] string!]   ?? num
num: none
Oldes
9-Jul-2006
[1358x2]
I just think he can end with endless loop easily, as he will never 
be able to catch the second 'image
>> parse ["hi"] [[set num [integer! | string!]] ] ?? num
num: "hi"