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

World: r3wp

[Core] Discuss core issues

Ladislav
22-May-2006
[4635]
(section 15)
Gregg
22-May-2006
[4636]
local without defining it in the spec
 -- I don't think that's a good way to think about modeling it.
Joe
22-May-2006
[4637]
I see. This is a major limitation. I see the rebol3 has a blog entry 
that "bind expands contexts" How could I approach this with the current 
rebol ?
Anton
22-May-2006
[4638]
No, that's right. Contexts cannot be extended with new words (at 
this time).  I would pass a context to your function with the template 
and all the words in it. This context will have to be built at the 
beginning.
Gregg
22-May-2006
[4639]
It's still not clear to me what the real goal is. i.e. where values 
come from and how eval-template may be reused without giving it some 
parameters to guide it.
Anton
22-May-2006
[4640]
Sorry, I mean you eval-template function can create a context on 
the fly with the words in it.
Joe
22-May-2006
[4641]
ok Anton, I will try to implement this with your approach
Anton
22-May-2006
[4642]
It's not a terribly easy thing to do, but can be done.
Joe
22-May-2006
[4643]
Gregg, the GOAL is to be able to have a generic eval-template function 
that can evaluate multiple templates without having to include hundreds 
of locals in eval template. The values are generated dynamically 
with a code-block e.g. eval-template template code-block where code-block 
is [title: func-title "aha" tag1: emit-whatever ...
Ladislav
22-May-2006
[4644]
hmm, I may not understand your wish, Joe, but don't you want to have 
it this way?
Pekr
22-May-2006
[4645]
Today I reread the blog, and I was not comfort with the idea that 
simple bind should auto-extend context ... maybe just my internal 
feeling, dunno .... just wanted to state opinion of less experienced 
reboller :-)
Ladislav
22-May-2006
[4646]
eval-template: func [
    template
    /local res
] [do something with the template...]
Anton
22-May-2006
[4647]
Eval-template will accept a template string
1) convert to block
2) extract the words
3) create a context with these words
4) unset all words in the context

5) do your code bound to the context   ( do bind your-code the-context 
)
6) handle errors
7) return results
Joe
22-May-2006
[4648]
What I've been using in the past is different versions of eval-template 
for each template and I found the typical bug to be when missing 
a local given that the templates are evaluated multiple times
Anton
22-May-2006
[4649]
After extracting the words you need to convert them all to set-words 
and put them in a spec block, eg:
spec: copy []
foreach word words [append spec to-set-word word]
append spec none
; now you can create the context using the spec
the-context: context spec
; now unset each word in the context, etc..
Joe
22-May-2006
[4650]
Yes anton, I will code it this way. I am worried that unbinding the 
words every time is a performance hit
Anton
22-May-2006
[4651]
Possibly, we can optimize it later. Binding is supposed to be pretty 
fast in rebol.
Joe
22-May-2006
[4652]
Ladislav, I will try to communicate better. What do you mean by "don't 
want to have it this way ?"
Ladislav
22-May-2006
[4653x2]
eval-template: func [
    template
    /local res
] [do something with the template...]
I just thought, that you wanted to have a function accepting and 
processing templates
Joe
22-May-2006
[4655]
Yes, my problem is an error handling problem. So far the template 
blocks are global, and I want to have functions that can build the 
templates without actually passing the template as a parameter
Ladislav
22-May-2006
[4656]
it looks, that you actually don't need UNBIND
Gregg
22-May-2006
[4657x2]
Could I ask again for pseudo-code? I'm having the same problem as 
Ladislav I think.
If we could step back and look at the problem, without implementation 
details, it would help me to understand.
Anton
22-May-2006
[4659]
Yes, it's a bit confusing jumping straight into it like this.
Gregg
22-May-2006
[4660x2]
I'm only asking because I think you're making this a lot harder than 
it needs to be, but I can't be sure if I don't understand the problem.
I've found that I can make things hard for myself, if I fight REBOL, 
or easy, if I don't.  :-)
Anton
22-May-2006
[4662]
Yes, I can't say I find myself needing to do such an operation very 
often. Been a while since I generated html though.
Joe
22-May-2006
[4663x4]
a new attempt. The code that follows works except that I have to 
define the tags as locals, which is a pain when there are lots of 
them
template:  	to block!  "<html><head><title> title </title></head><body>tag1 
tag2 tag3</body></html>"

blk:		remove-each val copy template [tag? val]	 ?? blk ; == [title 
tag1 tag2 tag3]

eval-template: func [
	/local res title tag1 tag2 tag3
][
	res: 		copy ""

	bind/copy 	blk 'res

	title: 		"hey"
	tag1: 		"this is tag1^/"
	tag2: 		"i am tag 2^/"
	;tag3: 		"might not be set^/"

	repend 		res bind/copy template 'res
	res
]


probe eval-template
so in this example tag3 is none because it was not set in the body 
but this is clearly an error. I am trying to solve 2 things:
1) Not having to declare the locals title tag1 tag2 tag3 in the function 
spec but have them as locals (might not be possible)
Ladislav
22-May-2006
[4667]
that *is* possible if needed
Joe
22-May-2006
[4668x2]
2) detect when one of the variables has not been set  . In the above 
example with locals defined this can easily be fixed by checking 
for tags that are none
Ladislav, then if there is an elegant way to define the locals inside 
the function body given blk: [title tag1 tag2 tag3] my problem is 
solved
Gregg
22-May-2006
[4670]
Why not just use FUNCTION with your existing code body and spec; 
make eval-template funcs on the fly?
Anton
22-May-2006
[4671x2]
You would have to define a function every time, yes.
(for the same reason - contexts can't be extended with new words).
Joe
22-May-2006
[4673]
Yes,  but how costly is this ? ( I currently can generate 1000 pages/minute)
Gregg
22-May-2006
[4674]
I would still lean towards a higher level solution at some point, 
but this makes more sense to me than messing with bindings.
Ladislav
22-May-2006
[4675]
;This is one way how to do it:
eval-template: lfunc [template [string!]][] [
	res: 		copy ""

	bind/copy 	blk 'res

	title: 		"hey"
	tag1: 		"this is tag1^/"
	tag2: 		"i am tag 2^/"
	;tag3: 		"might not be set^/"

	repend 		res bind/copy to block! template 'res
	res
]

see http://www.fm.tul.cz/~ladislav/rebol/lfunc.rThis would throw 
an error if the tag3: line is commented
Gregg
22-May-2006
[4676]
Profile it. :-) How many do you *need* to generate, how much data, 
how many tags, etc. There are a lot of variables here (no pun intended).
Joe
22-May-2006
[4677x2]
there are three approaches so far: 1) building function everytime 
with locals (anton/gregg) 2) template object (anton) and 3) lfunc
I am going to code this using lfunc for the simplicity it brings 
and see what I learn Thanks all
Ladislav
22-May-2006
[4679]
the LFUNC approach would cause an error if the 'TAG3 variable were 
used in the template, otherwise it wouldn't cause an error. Is that 
what you wanted?
Anton
22-May-2006
[4680]
(if your templates are not changing, the corresponding template objects 
can be made once and reused many times).
Joe
22-May-2006
[4681x3]
Ladislav, yes
Anton, can you code the above example using the template object you 
proposed
Maybe lfunc should be something part of Rebol3 .
Ladislav
22-May-2006
[4684]
:-)