• Home
  • Script library
  • AltME Archive
  • Mailing list
  • Articles Index
  • Site search
 

AltME groups: search

Help · search scripts · search articles · search mailing list

results summary

worldhits
r4wp4382
r3wp44224
total:48606

results window for this page: [start: 29401 end: 29500]

world-name: r3wp

Group: Core ... Discuss core issues [web-public]
[unknown: 5]:
18-Dec-2008
and 16 picks
BrianH:
18-Dec-2008
How often do you need to do these reads, and can they be sorted in 
batches?
[unknown: 5]:
18-Dec-2008
They do get sorted but they are done often and the batch sort is 
random sized depending on the request
[unknown: 5]:
18-Dec-2008
What if declared a field varchar[2000] and you only populate it with 
50?
[unknown: 5]:
20-Dec-2008
I tried  that after I posted Sunanda but even though I could get 
to them I was still able to out put a value of the local before setting 
them to none that way so what that  meant was that even though I 
attempted to set them to none! that way that it didn't take (and 
didn't give me an error either).
[unknown: 5]:
20-Dec-2008
Gregg, to reduce memory overhead and allow the garbage collector 
to give back some memory.
Geomol:
20-Dec-2008
I found a way to set all locals to none, while just specifying one 
of the locals, and it isn't beautiful, I'm afraid:

f: func [/local a b c][
	a: 1 b: 2 c: 3
	print [a b c]

	; This next line set all locals to none:
	set next bind first :f 'a none
	print [a b c]
]

Running the function in the console:
>> f
1 2 3
none none none
>>
Geomol:
20-Dec-2008
Hard to read that setting-to-none line, and I haven't found a way 
to do it by a function call (like a clear-locals function).
[unknown: 5]:
20-Dec-2008
Yeah I love Also Brian and glad you implemented that.  But this is 
really related to all the other non returned values.
Geomol:
20-Dec-2008
:-) It has to find the /local and remove it.
BrianH:
20-Dec-2008
John, you can't just access the context of a calling function or 
even the current function, even from a native. The code block your 
code is in can be assigned to many functions, and isn't bound to 
any context. Words are direct bound individually. If you want to 
clear a context, yo have to specify which one in a parameter.
BrianH:
20-Dec-2008
You can't get access to a function's context without having a known 
word that is already bouund to that context. When you do first :f, 
the words retrn are not bound to the function's context. In R2, when 
you do third :f you get words that are bound, but you can only guess 
to what., since words are bound individually. The only safe way to 
do clear-words is to pass both the function and a known word bound 
to the function's context, and even then you have to copy the fuunction's 
argument block and convert any refinements to words before you bind 
the copy.
[unknown: 5]:
20-Dec-2008
that is why I'm attempting this with third and using clear-locals 
:func :arg
BrianH:
20-Dec-2008
Sorry, I meant second. Second returns the code block. The first and 
third blocks are definitely *not* bound to the function's context.
BrianH:
20-Dec-2008
Getting a the argument list, which you would have to copy, convert 
refinements to words, then bind. The copy and conversion would be 
slower than necessary.
BrianH:
20-Dec-2008
Developer releases at least, and maybe before then.
[unknown: 5]:
20-Dec-2008
Everyone would ask "What is R3?" and then we could tell them about 
REBOL.
Steeve:
20-Dec-2008
clearly guys, a function should never be so huge and obscufated so 
that it will not be any more interesting to use a clear-locals func.
[unknown: 5]:
20-Dec-2008
I have 22 locals in one function alone already and even though I 
plan on reducing some of those in reducing some code, I have a feeling 
that I will regain them as I add more code in the function.
[unknown: 5]:
20-Dec-2008
What is happening with respect to memory and lower level activity 
when using the 'bind function?
Sunanda:
21-Dec-2008
Answers (which was intended for responses to challenges in the Puzzles 
group) is not [web-public], so half this discussion is hidden from 
anyone reading just the web archive.

It seems an important technique is under discussion. Could some one 
summarise the state of the art, and continue the discussion here?
Thanks!
Steeve:
21-Dec-2008
seems there is more indirect links between an object and his properties
Gabriele:
22-Dec-2008
Steeve, o and the result of bind? are the same context but not the 
same object. this is an implementation detail of R2.
Gabriele:
22-Dec-2008
I do not think this is a bug, and it may not be trivial to fix it 
if it was (which means, it'll never get fixed as Carl is not going 
to spend that much time on R2 for something not important)
Gabriele:
23-Dec-2008
Anton, it's not that it has any use, it's that there is no "object" 
internally, just a "context", and the bind? function creates an "object" 
for the "context" so that it can return it (there is no way to access 
a context directly). bind? does not know whether the context is already 
referenced by an existing object or not, nor has any way to get to 
any such existing objects, so it just always creates a new one.
[unknown: 5]:
25-Dec-2008
However, it allows you to be more flexible and possibly save some 
evaluation depending on how you implement it.
[unknown: 5]:
25-Dec-2008
Notice that example1 is more efficient than example 2.  However, 
Example 3 takes the flexibility of setting my-block to a cleared 
block and actually is more efficient than example 1.
PeterWood:
26-Dec-2008
I'm running a CGI script from which I want to 'launch another script 
to do some housekeeping. The output from the launched script (including 
the Rebol banners) is returned to the browser. Is there a way to 
redirect the output from the launched Rebol session?

(I am getting this behaviour on both Mac OS X and Linux).
[unknown: 5]:
26-Dec-2008
I spent a couple hours checking my code and yet  it seems LOOP is 
the culprit.
[unknown: 5]:
26-Dec-2008
I added copies and it didn't change anything so I removed them again.
[unknown: 5]:
26-Dec-2008
tried copy on that part also and it didnt' make a difference.
[unknown: 5]:
26-Dec-2008
Steeve, I see what you were saying.  I went ahead and fixed that 
by changing a piece of code so that the d block wasn't modified also.
Davide:
29-Dec-2008
Is there a way to modify an object (adding and removing components) 
at runtime without rebuild it from scratch ?

I remember an old thread in the mailing list abut this argument, 
but I cannot find it..
Steeve:
29-Dec-2008
and ??? it's not related with your previous request
Davide:
29-Dec-2008
Now I can ask a more precise question:

here is my problem:
I have an application object app that "serve" two client c1, c2

app: make object! [
	hset: func [c] [k: c/name]
	hget: func [c] [print ["k=" k]]
]

c1: make object! [
	name: "pippo"
]

c2: make object! [
	name: "pluto"
]


The handlers of app, use k as internal container, but of course it's 
shared between clients:

>> app/hset c1
== "pippo"
>> app/hset c2
== "pluto"
>> app/hget c1
k= pluto   


I would bind k (and every set-word in the handler) to the object 
passed as parameter so the last line would produce:

>> app/hget c1
k= pippo

Now I come to this solution, using blocks instead of funcs in app

app: make object! [
	hset: [k: name]
	hget: [print ["k=" k]]
]

c1: make object! [
	name: "pippo"
	vars: make object! [
		k: none
	]
]

c2: make object! [
	name: "pluto"
	vars: make object! [
		k: none
	]
]

This produce:

>>  do bind bind app/hset c1/vars c1
== "pippo"
>> do bind bind app/hset c2/vars c2
== "pluto"
>> do bind bind app/hget c1/vars c1
k= pippo


This works, but I have to collect every set-words used in the handler, 
into the clients (using Ladislav set-words http://www.fm.tul.cz/~ladislav/rebol/set-words.r
)


sw: copy [] repeat h next first app [sw: union sw set-words app/:h]

b: copy [] repeat w sw [insert tail b reduce [to set-word! w none]] 
vars: make object! head b
c1/vars: vars
c2/vars: vars


Now, my questions are:
1) Is this approch "rebolish" ? There's a smarter way to do it ?
2) If I need a function in my app like:

app: make object! [
	hset: [k: avg a b]
	hget: [print ["k=" k]]
	avg: func [x y] [aux: x + y aux: aux / 2]
]


How can I collect the aux: word in avg function, and bind this function 
to c1/vars ?
Davide:
30-Dec-2008
k: c/name and print ["k=" k] are only one (stupid) example that use 
a word k that I want to keep distinct between client.. Every client 
need its instances of words.
Steeve:
30-Dec-2008
again, why don't you define K and aux localy to your object ?
app: make object! [
	k: aux: none
	hset: does [k: avg a b]
	hget: does [print ["k=" k]]
	avg: func [x y] [aux: x + y aux: aux / 2]
]
[unknown: 5]:
3-Jan-2009
That is somewhat simliar but that sounds like you were interested 
in executing any script code in a sandbox.  What I'm doing is allowing 
all other values to be reduced except allowed functions and natives.
btiffin:
3-Jan-2009
I think Maxim mentioned that he had done a lot of work when he sandboxed 
Elixir.  I didn't study enough of the magic Elixir to know how he 
pulled it off, but if it's Max, it's good and ahead of it's time.
[unknown: 5]:
3-Jan-2009
For example, my function will take a series and if anything in it 
is a function or native then it will change that word to a literal 
so that it is then seen as a value.
BrianH:
3-Jan-2009
Chris, you missed that being able to screen for "bad" functions is 
what Paul is trying to do. It is much easier to maintain a whitelist 
than a blacklist, and easier to implement in R2 as well.
Gregg:
4-Jan-2009
I've done the mold+load trick as well Henrik. I've also taken the 
block from THIRD and changed each word type to lit-word.

  change-each w third things [either word? w [to-lit-word w] [w]]
Pekr:
5-Jan-2009
IIRC r3 architecture counts on it, and there should be ipc:// scheme, 
or I think I saw something like that proposed :-)
Sunanda:
7-Jan-2009
/secure provides its own seed. Theoretically, that seed is less guessable 
than the sort of things we are likely to think of in mezzanine code 
-- like time/precise.

But we don't know for sure. All we do know is that with /seed we 
can provide the same seed and get the same series of random values; 
while with /secure if is not so easy.
Sunanda:
7-Jan-2009
That's what I use it for, anyway. Try this and see the effect:

loop 5 [random/seed 100 print "start of new series" loop 5 [print 
random 100]]
Sunanda:
7-Jan-2009
I think that may be so he can later _remove_ the /seed and have secure 
numbers once testing is complete.   Look at the *bad* effect of starting 
with a seed in my example:

loop 5 [random/seed 100 print "start of new series" loop 5 [print 
random/secure 100]]
Sunanda:
7-Jan-2009
Or do not have one when using /secure, and expecting /secure to work!
Henrik:
7-Jan-2009
sunanda and when there is a million values?
Gregg:
7-Jan-2009
There are a lot of ways to do it. Some people use the GUID API on 
Windows. Some use a high-low model, kind of like you are by including 
the PID. Combining clock (with setback checking), counter, machine 
info, and a key (like PID), is plenty good.
btiffin:
7-Jan-2009
Historical?   start (set) and then end (report).    R3 has a dt (delta-time) 
function built in and some other nice profiling words.
Henrik:
8-Jan-2009
really? perhaps there's no correlation between randomness and risk 
of collision.
Gabriele:
8-Jan-2009
and indeed, for UUIDs, it may be ok to be predictable as long as 
you can reduce collisions.
Gabriele:
8-Jan-2009
for example, if you had a clock with a precision of 10^-5 seconds, 
and you knew it was impossible to have more than 10000 requests per 
seconds, then you would be fine to just use your clock as your UUID.
Henrik:
8-Jan-2009
so there is a sequential part and a random part.
Pekr:
8-Jan-2009
yes, I am just looking at it and wondering, why import-email does 
not have such refinement :-)
Geomol:
8-Jan-2009
Henrik, Rebolek posted this code in the "View" group last year to 
illustrate the difference between random and random/secure:

img: make image! 512x512 
repeat i 512 [
	repeat j 512 [
		either i < 256 [
			if 2 = random 2 [
				img/(as-pair i - 1 j - 1): 255.255.255
			]			
		][
			if 2 = random/secure 2 [
				img/(as-pair i - 1 j - 1): 255.255.255
			]
		]
	]
]


view layout [image img across text "RANDOM" tab tab tab text "RANDOM/SECURE"]
Steeve:
8-Jan-2009
i noticed that op! functions can't be reduced, is it a bug ? (in 
R2 and even in the R3).
>> do reduce [:add 1 1]
==2
>> do reduce [1 :+ 1]
** Script error: cannot use add on none! value
** Where: applier do
** Near: op! 1
BenBran:
16-Jan-2009
The past few weeks I've had more time to devote to Rebol.  I'm working 
on some typical examples and routines to get aquainted with it.  
So I appreciate all the help I'm getting from this forum.  Currently 
just playing with the delete-dir function.

I'm not able to get this to work....is this even possible.....

in the environment: myPath = C:\myTemp

	myPath: probe get-env "myTemp"

 ....(tried several iterations of code here to fix the path perfectly)
	delete-dir myTemp

also tried reduce 

the path has been refomed to //%/myTemp/, %C/myTemp/,  and several 
others forms.

it says that it expects a dir argument of type: file url
Janko:
19-Jan-2009
btiffin: I am newbie at linux... you mean I can make a named pipe 
in command line with mkfifo and then rebol uses that as a normal 
filename to write/read from it? Similarly the other language has 
Unix package and can make named pipes by it's own... can rebol create 
pipe too? (sorry if I got it all wrong)
Janko:
19-Jan-2009
about hanging, yes I read that write does not happen untill there 
is a read at the other side and vice versa so I was thinking if there 
is some king of timeout possible..
btiffin:
19-Jan-2009
Well normally fifo files are created in blocking mode, so yeah a 
write won't complete until a read occurs and a read will wait for 
a writer (by default).  I'll be honest, I've not done this from REBOL, 
but with 2.7.6 and LOAD/LIBRARY freed, we can do any libc6 calls 
that we want, so you should be able to set a non blocking mode and 
get true multiple writes and reads that will return empty if no data 
is queued.


For OpenCOBOL I implemented POSIX Message Queues; as MQ_NOTIFY will 
make a callback when the queue goes from empty to non-empty and you 
don't have to worry about spinning on a read.


If you don't mind playing with  make routine!  take a look at mq_open 
and friends (man mq_overview) it might offer more control for IPC.
Janko:
20-Jan-2009
thanks btiffin for such great explanation, yes I was looking at message 
queues too at first but then someone proposed pipes and they do seem 
more accessible/simple to start in a way.
Janko:
20-Jan-2009
Is there any article or blog post about 2.7.6 being able to load 
native libraries? I searched and couldn't find any info on this.. 
I found docs for REBOL/Command/SDK version so this would be a place 
to start experimenting probably
Janko:
20-Jan-2009
so I can compare a little , and I will probably need it also
Pekr:
21-Jan-2009
And - imo if RT would post some formal specification to the language, 
we could fix some gotchas and surprises, not trying to find academic 
theories, why it work certain way ...
[unknown: 5]:
21-Jan-2009
But to me Henrik the append or insert should be able to look at the 
argument and see it is already a lit-word and append it as such.
[unknown: 5]:
21-Jan-2009
But couldn't insert be modified to see that it is appending a lit 
word to a block and make the appropriate modification?
[unknown: 5]:
21-Jan-2009
But I already get the idea.  That the idea is that it it is now a 
word and  not a lit-word!
BrianH:
21-Jan-2009
No, it was an expression of the words append and a and a lit-word 
'b. DO evaluated the expression, and while doing so evaluated the 
'b to create b. Then it passed the b to the function referenced by 
the word append.
[unknown: 5]:
21-Jan-2009
Back to this issue, I checked replace and it doesn't support replacing 
word! in a block with lit-words.
[unknown: 5]:
21-Jan-2009
I'm moving on from that issue.  I'll wait and consider R3.  But these 
pitfalls have already got me into other languages.
BrianH:
21-Jan-2009
This is true for R3 and 2.7.6+ at least.
[unknown: 5]:
21-Jan-2009
I just noticed this group is web-public.  Shouldn't this be a bit 
more closed as often bugs and such are discussed here.
BrianH:
21-Jan-2009
BACKPORTS! Hot off the presses! Get your new R3 functions, now here 
for R2! Available now, before the next release!

funct: make function! [
    [catch]
    "Defines a user function assuming all set-words are locals."

    spec [block!] "Help string (opt) followed by arg words (and opt type 
    and string)"
    body [block!] "The body block of the function"
    /local r ws wb a
][
    spec: copy/deep spec
    body: copy/deep body
    ws: make block! length? spec
    parse spec [any [

        set a [word! | refinement!] (insert tail ws to-word a) | skip
    ]]
    wb: copy ws
    parse body r: [any [
        set a set-word! (
            unless find wb a: to-word a [insert tail wb a]
        ) |
        hash! | into r | skip
    ]]
    unless empty? wb: difference ws wb [
        remove find wb 'local
        unless find spec /local [insert tail spec /local]
        insert tail spec wb
    ]
    throw-on-error [make function! spec body]
]

functor: make function! [
    [catch]

    "Defines a user function with all set-words collected into a persistent 
    object (self)."

    spec [block!] "Help string (opt) followed by arg words (and opt type 
    and string)"
    body [block!] "The body block of the function"
    /local r wb a

][ ; Note: Words in the spec override the bindings of the object 
words.
    wb: copy []
    parse body r: [any [
        set a set-word! (unless find wb a [insert tail wb a]) |
        hash! | into r | skip
    ]]
    remove find wb [self:]

    throw-on-error [make function! copy/deep spec  bind/copy body construct 
    wb]
]
BrianH:
21-Jan-2009
Obviously the R3 versions are faster, smaller and more efficient, 
but the meaning is the same. And you can use them now in R2.
BrianH:
21-Jan-2009
They are declared as code blocks in R3, not functions, and then turned 
into functions using a fixed spec and FUNCT. Safer that way.
BrianH:
21-Jan-2009
R3 has changed SET to allow [set-word:] arguments so that they can 
be used with functions like FUNCT and FUNCTOR. R2 not (yet?).
Janko:
22-Jan-2009
>> b: 'test   ;; line gets evaluated , b already holds a word!
== test
>> append a :b  ;; word get's added to serries
== [test]
>> type? first a
== word!

>> find a 'test  ;; 'test get's evaluated into a word again so find 
finds it in block
== [test]

>> c: ['test]      ;; 'test is in a block and of course doesn't get 
evaluated as any other thing in a block wouldn't so it stays lit-word!
== ['test]
Janko:
22-Jan-2009
BrianH and others : you made such great word (and ported it to mezzaine 
- I still have no idea what that is :) ) of the word map (as in functional 
programming ) ... did you maybe or is there any chance that its sister 
function reduce or fold or fold-left could be made in such a way.. 
I use your map a lot now but I have to use my poor fold word for 
folds :)
Will:
24-Jan-2009
on OS X and Linux, for every instance of rebol , 2 processes are 
launched, the second for dns, right? is there any known bug? I have 
an difficult to debug situation , when quitting cheyenne after some 
load, some handler process goes 100% cpu, but the dns process is 
no more there, this make me think it may be a problem with rebol, 
otherwise also if one process would go 100% CPU, the dns one would 
still be present, help!! 8)
Oldes:
25-Jan-2009
When you did call, the black cmd window was always visible. Now you 
must do call/show to see the window (which you mostly don't want 
to see) And  I think this was just Windows change. I'm not sure how 
it worls on Linux or in other OSes.
Will:
25-Jan-2009
I'm on 2.7.6 os x , symtom is rebol just goes mad using up 100% CPU 
and never quits , using "ktrace -p processid" generate an empty ktrace.out
Oldes:
25-Jan-2009
And how do you start the script? Do you use -cs switch?
Oldes:
25-Jan-2009
I'm testing it now with cheyenne and it seems not to be working... 
even if I do:
	print "Content-type: text/html^/"
	tmp: copy ""
	call/output/wait "dir" tmp
	probe tmp
Oldes:
25-Jan-2009
CPU is fine here.. just the output is missing and there is error:
Error Code :  	300
Description : 	script error !
tmpnone has no value
Near : 	[probe tmpnone]
Where : 	protect-code
Will:
25-Jan-2009
sorry I may have been more clear, the code is in uni-engine.r, this 
line:

call/show join form to-local-file system/options/boot [" -qs " cmd]
not in a RSP, and not sure at all the problem is with call... 8/
BrianH:
25-Jan-2009
More backports: AJOIN

ajoin: func [
    "Joins a block of values into a new string."
    block [block!]
] [
    head insert copy "" reduce block
]


AJOIN is native in R3 and doesn't generate an intermediate block 
(it reduces in place), but even in R2 it has advantages:

- It always returns a string, no matter what the type of the first 
value in the block is.
- It is faster than REJOIN.
[unknown: 5]:
25-Jan-2009
Might change the description a bit to say that is reduces the block. 
 "Reduces a block of values and joins them into a new string."  Reducing 
is a security concern so we might want to ensure whoever uses the 
function is aware of this.
BrianH:
25-Jan-2009
COPY "" is faster than MAKE STRING! 0 (amazingly enough), and you 
don't have to allocate a literal "" every time, just once at LOAD 
time
BrianH:
25-Jan-2009
Speed is a bigger concern for mezzanines, but there has to be a balance. 
We are doing more advanced tricks in R3 to increase speed and reduce 
memory overhead, but R2 is in bugfix and backport only mode right 
now.
Dockimbel:
26-Jan-2009
Side effect of slow interpreter loop and fast natives.
Gabriele:
27-Jan-2009
BTW DideC, if you use now/precise instead of now/time/precise and 
use difference instead of - then you don't have a problem around 
midnight.
kcollins:
31-Jan-2009
Here's another way which is arguable cleaner, but more verbose and 
less efficient: p: "3" (index? find "0123456789" p) - 1
Tomc:
1-Feb-2009
and it isarbitrry precision as well
Dockimbel:
1-Feb-2009
I've just hit a serious issue in 2.7.6 on UNIX platforms today.


Briefly: CLOSE on TCP ports doesn't work anymore if CALL is used 
before CLOSE, in a AWAKE handler.

To reproduce this bug, get the tests scripts here :

write %server.r read http://softinnov.org/tmp/server.r
write %client.r read http://softinnov.org/tmp/client.r
write %foo.r read http://softinnov.org/tmp/foo.r


Then, read the comment section in %server.r and launch it to see 
by yourself : do %server.r

Notes:
     o Windows is not affected by this issue.

     o I consider this a major issue for all REBOL server applications 
     working in async mode and spawning processes.

     o I'm posting first here before RAMBO, so that people can test and 
     point out any possible bad interpretation from me.
Dockimbel:
1-Feb-2009
If a few ppl can confirm this rapidly, I'll post a ticket in RAMBO 
and will knock on Carl's door to fix that asap.
Maarten:
1-Feb-2009
Doc, iirc there was a same sort of isseu with system ports in pre-2.7.6 
and TCP and Gabriele got around it in the Detetcive project. He also 
wrapped up the async-call and made it available for linux then. I 
have it, he has it, but I suspect Gabriele can fill you in on the 
details. Let me know if (and how) you want it.
Will:
1-Feb-2009
anyone else on non window os can test and confirm please?
btiffin:
1-Feb-2009
I made a post about 2.7.6 being near the end of life of the REBOL 
2 line.  I was told by Carl that I was mistaken ... completely.  
That was oh, 8 months ago or so.   At that time; REBOL 2 is still 
very much an RT supported product line and there are no plans to 
change that stance.
Anton:
2-Feb-2009
After 5 seconds, client.r and foo.r are present:

$ ps aux | grep reb[v]iew

anton     9006  0.0  0.4  13268  9656 pts/1    SNs+ 00:33   0:00 
/rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true

anton     9007  0.0  0.0   6084   536 pts/1    SN+  00:33   0:00 
/rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true

anton     9008  0.0  0.0   6084   464 pts/1    SN+  00:33   0:00 
/rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true

anton     9072  0.3  0.3  11952  8228 pts/1    SN+  00:35   0:00 
/rebol/rebview2.7.006.4.2 -qws client.r

anton     9073  0.0  0.0   6128  1084 pts/1    SN+  00:35   0:00 
/rebol/rebview2.7.006.4.2 -qws client.r

anton     9074  0.0  0.0   6084   468 pts/1    SN+  00:35   0:00 
/rebol/rebview2.7.006.4.2 -qws client.r

anton     9079  0.5  0.3  11828  8068 pts/1    SN+  00:35   0:00 
/rebol/rebview2.7.006.4.2 -qws foo.r

anton     9080  0.0  0.0   6084   536 pts/1    SN+  00:35   0:00 
/rebol/rebview2.7.006.4.2 -qws foo.r

anton     9081  0.0  0.0   6084   464 pts/1    SN+  00:35   0:00 
/rebol/rebview2.7.006.4.2 -qws foo.r

After foo.r finishes waiting:

$ ps aux | grep reb[v]iew

anton     9006  0.0  0.4  13268  9656 pts/1    SNs+ 00:33   0:00 
/rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true

anton     9007  0.0  0.0   6084   536 pts/1    SN+  00:33   0:00 
/rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true

anton     9008  0.0  0.0   6084   464 pts/1    SN+  00:33   0:00 
/rebol/rebview2.7.006.4.2 -s -- do-anton-user?: true

anton     9072  0.4  0.0      0     0 pts/1    ZN+  00:35   0:00 
[rebview2.7.006.] <defunct>

anton     9079  0.4  0.0      0     0 pts/1    ZN+  00:35   0:00 
[rebview2.7.006.] <defunct>


And when close port is done before call in the awake function, then 
client.r becomes defunct while foo is still waiting.
29401 / 4860612345...293294[295] 296297...483484485486487