(cd (pack (sys "HOME") "/picolisp")) (load (pack (sys "HOME") "/src/picolisp/nb.l")) # (out "/tmp/a" (wrx '(1 2 3 4) 4)) # (out "/tmp/a" (wrx '(1 2 3 4) 3 1)) # (setq *B (need 5)) # (in "/tmp/a" (rdx *B 3)) # (in "/tmp/a" (rdx *B 2 3)) # *B # non-blocking echo server (setq *N 5) # try bigger buffer;-) (setq *B (need *N)) (setq *I 0) (setq *J 0) (set 'EAGAIN (eagain)) (de _rdx (Sock) (in Sock (let? N (rdx *B (- *N *I) *I) (when (gt0 N) (inc '*I N)) N))) (de _wrx (Sock) (out Sock (let? N (wrx *B (- *I *J) *J) (when (gt0 N) (inc '*J N)) N))) (de callback (Sock) (let End NIL (prinl "callback " Sock " J=" *J " I=" *I " N=" *N) (block Sock NIL) # first time would be enough (unless End (let N (_rdx Sock) (prinl " read " N) (unless (or (gt0 N) (= N 'EAGAIN)) (setq End (cons rd N))))) (unless End (let N (_wrx Sock) (prinl " written " N) (unless (or (gt0 N) (= N 'EAGAIN)) (setq End (cons wr N))))) (when End (prinl " finish") (task Sock) (close Sock)) (when (<= *I *J) (prinl " rotate J=" *J " I=" *I " N=" *N) (setq *I 0) (setq *J 0)) (prinl "end " Sock " J=" *J " I=" *I " N=" *N))) (task (port 4444) # Listen on port 4444 (when (accept @) # A connect arrived (task @ # Install another task on this socket Sock @ # Keep the socket in the task's env (callback Sock) ) ) )