World: r3wp
[!REBOL3-OLD1]
older newer | first last |
Ladislav 5-Apr-2006 [62] | I am pretty sure it will, at worst with a simple modification |
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: |
older newer | first last |