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

World: r3wp

[!REBOL3-OLD1]

Geomol
5-Apr-2006
[63x2]
To understand it better...
I can make a function this way to have initialisation every time:
f: func [/local a] [a: 0 a: a + 1]
What exactly is the goal with CLOSURE?
Ladislav
5-Apr-2006
[65x4]
example of the CLOSURE behaviour:
b: []
    f: closure [x] [append b 'x]
    f 1 ; == [x]
    f 2 ; == [x x]
    reduce b ; == [1 2]

; which means, closure variables somehow "remember" their values, 
compare it to:
>> g: func [x] [append a 'x]
>> g 1
== [x]
>> g 2
== [x x]
>> reduce a
== [2 2]
(where a was defined to be an empty block initially)
Geomol
5-Apr-2006
[69]
hm tricky. It needs some getting used to. And you question is, if 
closure should initialise very time? What will happen, if it doesn't?
Ladislav
5-Apr-2006
[70]
CLOSURES are actually something like "more proper" functions, but 
their evaluation is "more expensive" (takes more time)
Geomol
5-Apr-2006
[71x2]
Will people understand the difference?
And is it usefull?
Ladislav
5-Apr-2006
[73x2]
will people understand the difference: *if* they come into trouble 
when using FUNCS, closures may help them to obtain the desired behaviour
more "persuasive" example:
Geomol
5-Apr-2006
[75]
ahh, good point!
Ladislav
5-Apr-2006
[76x4]
make-f-returning: func [x] [does [x]]
f-returning-ok: make-f-returning "ok"
f-returning-ok ; == "ok"
f-returning-wrong: make-f-returning "wrong"
f-returning-wrong ; == "wrong"
f-returning-ok ; == "wrong"
make-g-returning: closure [x] [does [x]]
g-returning-ok: make-g-returning "ok"
g-returning-ok ; == "ok"
g-returning-wrong: make-g-returning "wrong"
g-returning-wrong ; == "wrong"
g-returning-ok ; == "ok"
what do you say to this?
the alternative to the initialization block is to not use it and 
initialize everything to NONE like in the FUNC case
Geomol
5-Apr-2006
[80x2]
ok, I see the difference. And I guess, it's benefitial, because using 
bind can be difficult.

And your question is, if closure should have a third block with "cheap" 
initializations?
Like in your:
 c: closure [/local a] [a: 0] [a: a + 1]
Ladislav
5-Apr-2006
[82]
the question is, if users want to have the additional (actually second) 
block for the initialization purposes of do not mind to have everything 
initialized to NONE
Geomol
5-Apr-2006
[83x3]
Damn hard question! :-)
It mayl be easier to say, when I've done 10 programs using closure. 
But I'll think about it.
may
Ladislav
5-Apr-2006
[86]
you do not have to know anything about closure, you may imagine the 
same question for FUNC case: would you appreciate to be able to specify 
the initial values for locals?
Geomol
5-Apr-2006
[87x3]
Before I answer that..

I use FUNC all the time. I almost never use FUNCTION. I guess, because 
I have to write more with FUNCTION.
I also started to use HAS and DOES, when I found those.
CLOSURE may come in the group with FUNCTION, if it get 3 blocks as 
arguments, so I may not use it.
Could it be possible to make the initial assignments in the first 
(and only) argument block?
Ladislav
5-Apr-2006
[90]
the only disadvantage of initialization I came to is the more complicated 
interface to CLOSURE needing always one more block to specify
Geomol
5-Apr-2006
[91]
I think, that's a very good point! REBOL programmers don't like to 
write much.
Ladislav
5-Apr-2006
[92]
it may be possible to put the initializations into the first block 
but that would cost some syntax complications and differencess too...
Geomol
5-Apr-2006
[93x2]
yeah
Could we have 2 versions of closure, like we have func and function? 
One where init = NONE and one with the extra block?
Ladislav
5-Apr-2006
[95]
probably yes, although Carl always hesitates to include unwanted 
features
Geomol
5-Apr-2006
[96x4]
I can understand that.
Let's see another example with the extra block:
f: closure [x /local a]Ê[a: 2 * pi] [(sine/radians x) / a]

without:
f: closure [x /local a] [a: 2 * pi (sine/radians x) / a]


Is it something like this, you're thinking about? And will the first 
be faster than the second?
And the third possibility (which maybe not is very REBOLish):
f: closure [x /local a: 2 * pi] [(sine/radians x) / a]
Ladislav, will rebcode be part of REBOL3? Do you know?
Ladislav
5-Apr-2006
[100]
I do not know, but think so
Geomol
5-Apr-2006
[101]
Is the idea, that the second closure block will only be parsed one 
time? (and therefore be fast)
Ladislav
5-Apr-2006
[102]
yes
Allen
5-Apr-2006
[103]
Rebcode is mentioned on the roadmap doc
Geomol
5-Apr-2006
[104]
Ok, functions with many constants will be much faster with this extra 
block then, right?
Ladislav
5-Apr-2006
[105]
faster, yes, much faster - maybe not
Geomol
5-Apr-2006
[106]
Where is your opinion against? With or without the extra block?
Ladislav
5-Apr-2006
[107]
my opinion is not strong, therefore I am asking
Geomol
5-Apr-2006
[108]
hehe :)
Ladislav
5-Apr-2006
[109]
the main point against it is the more complicated syntax, which could 
be used for static initialization, that may be even more useful sometimes
Geomol
5-Apr-2006
[110]
I have a feeling, that it'll be a little too much to write (like 
with function), and therefore I'll probably wont use it much.
Ladislav
5-Apr-2006
[111]
too much to write: actually not, let's compare:
Geomol
5-Apr-2006
[112]
If the idea with closure is, that programmers having trouble with 
func (and feel going into using bind is difficult), then the more 
complicated syntax will also not be good, as you say.