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

World: r3wp

[!REBOL3-OLD1]

BrianH
12-Feb-2009
[11118x2]
it -> if
The function value is like :add, the function spec is (in R2) third 
:add or (in R3) spec-of :add.
>> print mold third :add
[
    "Returns the result of adding two values."
    value1 [number! pair! char! money! date! time! tuple!]
    value2 [number! pair! char! money! date! time! tuple!]
]
Janko
12-Feb-2009
[11120]
Brian .. some most certanly a crazy question ... is there a way you 
could walk/execute a block of code in steps ... this is probably 
possible (if they take no arguments)  [ func-1 func-2 func-3 ] ... 
but is there some "magic" way to execute make func consume their 
arguments, like this >> b: [ print "hello" add 4 6 ]<< and >>do get-expr 
b 1<< would print "hello" and >>do get-expr b 2<< would calcualate 
10 ... I know this is probably not even remotely possible
BrianH
12-Feb-2009
[11121]
Yes, DO/next. But it doesn't work in R3 yet, just R2. That is a bug, 
btw.
Janko
12-Feb-2009
[11122]
what is a bug?
BrianH
12-Feb-2009
[11123]
DO/next not working in R3. It's not an intentional change.
Janko
12-Feb-2009
[11124x2]
hm.. :) there really is do/next :)) awesome
aha... I was scared do/next is a bug :)
BrianH
12-Feb-2009
[11126x2]
DO was rewritten in R3, and not all of the old behavior is implemented 
yet. Though there are some intentional differences.
LOAD was rewritten too, as a mezzanine, by me. There is still some 
missing functionality, and some fixes to bugs in R2's LOAD.
Janko
12-Feb-2009
[11128]
I am trying the do/next .. I can execute first expression but then 
I am a little lost of what to *do next* ( hehe)... >> b: copy [ empty? 
"" empty? "a" ]     do/next b == [true [empty " "]] <<  I tried >> 
b: next do/next b <<
BrianH
12-Feb-2009
[11129x2]
set/any [value code] do/next code
'value gets set to the result of the first evaluation, 'code gets 
set to the code block at the position after the first expression.
Janko
12-Feb-2009
[11131x2]
aha, that's why it says it returns two things in help
so code is a code block and value is something that has a result 
that code block would return if I do it at the end ?
BrianH
12-Feb-2009
[11133]
>> do/next [1 + 1 2 + 2]
== [2 [2 + 2]]

That last block is an offset reference to the original code block.
Janko
12-Feb-2009
[11134]
it works here too.. one strange thing is that at the last do/next 
I get right value for the end of the block and if I do/next again 
that value get's unset (I didn't know that is even possible) >>>value
** Script Error: value has no value
** Near: value<<<
BrianH
12-Feb-2009
[11135]
>> mold/all do/next [1 + 1 2 + 2]
== "[2 #[block![1 + 1 2 + 2]4]]"
Janko
12-Feb-2009
[11136]
so now I just need to figure out how to detect when the last block 
is evaluated .. that is probably when the oftest block is empty...
BrianH
12-Feb-2009
[11137]
Yup.
Janko
12-Feb-2009
[11138x3]
I mean the whole block .. (in a loop)
I will try
ha, works on all test blocks I tried :)   step-block: func [ code 
] [ until [ set/any [ value code ] do/next code empty? code ] value 
]
BrianH
12-Feb-2009
[11141]
:)
Janko
12-Feb-2009
[11142]
I thought I will ask a very very stupid question and it turns out 
this is very nicely possible already
BrianH
12-Feb-2009
[11143]
Except in R3, for now :(
Janko
12-Feb-2009
[11144x2]
would this enable us to do some sort of "green threading" without 
the need to maually yield even?
absolutely no problem , if it's "for now"
BrianH
12-Feb-2009
[11146]
Yes, but watch out: If there is a function call, the *whole* call 
gets executed, even if it is long. Your granularity of preemption 
of your manual multithreading is going to be pretty coarse.
Janko
12-Feb-2009
[11147x2]
yes, I know.. no long running tasks as with coroutines for example 
( I am not really specialist in this, I only used it few times)
basically I don't have the full picture, it's just awesome that something 
like this can be done inside a language itself
BrianH
12-Feb-2009
[11149]
It will be like cooperative multi-threading with no yield statement 
(that I can see), but an implied yield between top-level expressions.
Janko
12-Feb-2009
[11150x2]
yes, it looks like that .. I will try to make a simple step-blocks 
function and see what it does
if you would want to switch you could also step until you hit a certain 
word probably and then switch to other funct
BrianH
12-Feb-2009
[11152]
With DO/next and pseudothreads you could do full fake cooperative 
multithreading.
Janko
12-Feb-2009
[11153x2]
what are pseudothreads?
you mean the R3 threads/processes?
BrianH
12-Feb-2009
[11155x3]
Sorry, meant Protothreads: fake threading done with macros and special 
tricks. A C version: http://www.sics.se/~adam/pt/
The principle could be done in REBOL by preprocessing the code - 
easier than in C, though we don't have the switch trick.
C-style protothreads requires compilation to rebcode though, so we 
can use the brab opcode.
Janko
12-Feb-2009
[11158]
(the page doesn't load to me so I will keep trying)
BrianH
12-Feb-2009
[11159]
Sorry, broken link. Try this: http://en.wikipedia.org/wiki/Protothreads
Janko
12-Feb-2009
[11160x2]
these things are very interesting to me but I am a little
uh.. I wanted to delete that but clicked the send button :) ..
BrianH
12-Feb-2009
[11162]
Aren't we all "a little", sometimes :)
Janko
12-Feb-2009
[11163x2]
:)
is this how stackless works (because it mentions no stack)
BrianH
12-Feb-2009
[11165]
If by "how stackless works" you mean Stackless Python, then no. That 
works using continuation passing style.
Janko
12-Feb-2009
[11166x2]
aha, I meant stackless pythong.. you seem to really understand this 
stuff :)
python = pythong