Seems like we have to live with `async`, let's think if we can improve how it's 
used. I [used Nim async](https://github.com/al6x/nim/tree/main/nodem) and it 
looks to me, compared to the experience of Async in JavaScript, there are 
couple of things could be improved.

1 Use same `await` instead of `wait_for` if async needs to be called in sync 
function.

2 No sync IO instead of async proc allowed, mark all non-async IO with `syncio` 
and throw error if it's used in async proc. It is ok to block async event loop 
with CPU, it terrible if it's blocked with sync-IO.

3 Allow implicit return from async functions.

4 Allow to return future from async function.

5 Rename `async_check` as `spawn(Future)` or `check(Future)`.

6 Remove `run_forewer`, if there's at least one listener registered on the 
event loop keep process running.

7 Don't print ugly multi-page async error stack traces, if it can't be made 
short and clean it's better to not print it at all, as they are usually useless 
anyway.

8 `with_timeout` should throw error or return `Future[T]`, not `Future[bool]`.

9 Maybe Stop using `{.async.}` the code is noisy, if function returns `Future` 
it's async.

What do you think? If we have to live with it, let's make it great! :)

# Examples

None of it works right now:

a)
    
    
    proc a: Future[int] = 10
    
    
    Run

b)
    
    
    proc a: Future[int] {.async.} = 10
    
    
    Run

c)
    
    
    proc a: Future[int] {.async.} = return 10
    
    proc b: Future[int] {.async.} = a()
    
    
    Run

d)
    
    
    proc somefn1: Future[int] {.async.} = return 10
    
    proc somefn2: Future[int] {.async.} = return somefn1()
    
    
    Run

e) How the async error message looks like
    
    
    nim c -r nodem/greeting_example/user.nim
    /alex/projects/nim/nodem/greeting_example/user.nim(14) user
    /alex/projects/nim/nodem/nodem.nim(359) run
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208) 
processPendingCallbacks
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29) 
callNimAsyncContinue
    /alex/projects/nim/nodem/nodem/netm.nim(120) callIter
    [[reraised from:
    /alex/projects/nim/nodem/greeting_example/user.nim(14) user
    /alex/projects/nim/nodem/nodem.nim(359) run
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208) 
processPendingCallbacks
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29) 
call_nimported_functionNimAsyncContinue
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145) 
call_nimported_functionIter
    /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372) read
    ]]
    [[reraised from:
    /alex/projects/nim/nodem/greeting_example/user.nim(14) user
    /alex/projects/nim/nodem/nodem.nim(359) run
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208) 
processPendingCallbacks
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29) 
call_nimported_functionNimAsyncContinue
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145) 
call_nimported_functionIter
    /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372) read
    ]]
    [[reraised from:
    /alex/projects/nim/nodem/greeting_example/user.nim(14) user
    /alex/projects/nim/nodem/nodem.nim(359) run
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208) 
processPendingCallbacks
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29) 
say_hiNimAsyncContinue
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145) say_hiIter
    /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372) read
    ]]
    [[reraised from:
    /alex/projects/nim/nodem/greeting_example/user.nim(14) user
    /alex/projects/nim/nodem/nodem.nim(359) run
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208) 
processPendingCallbacks
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29) 
selfNimAsyncContinue
    /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145) selfIter
    /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372) read
    ]]
    [[reraised from:
    /alex/projects/nim/nodem/greeting_example/user.nim(14) user
    /alex/projects/nim/nodem/nodem.nim(359) run
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
    /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208) 
processPendingCallbacks
    /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(420) 
asyncCheckCallback
    ]]
    Error: unhandled exception: Timed out, connection closed
    Async traceback:
      /alex/projects/nim/nodem/greeting_example/user.nim(14)         user
      /alex/projects/nim/nodem/nodem.nim(359)                        run
      /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
      /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
      /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
      /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208)  
processPendingCallbacks
      /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29)      
callNimAsyncContinue
      /alex/projects/nim/nodem/nodem/netm.nim(120)                   callIter
      #[
        /alex/projects/nim/nodem/greeting_example/user.nim(14)         user
        /alex/projects/nim/nodem/nodem.nim(359)                        run
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208)  
processPendingCallbacks
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29)      
call_nimported_functionNimAsyncContinue
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145)     
call_nimported_functionIter
        /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372)   read
      ]#
      #[
        /alex/projects/nim/nodem/greeting_example/user.nim(14)         user
        /alex/projects/nim/nodem/nodem.nim(359)                        run
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208)  
processPendingCallbacks
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29)      
call_nimported_functionNimAsyncContinue
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145)     
call_nimported_functionIter
        /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372)   read
      ]#
      #[
        /alex/projects/nim/nodem/greeting_example/user.nim(14)         user
        /alex/projects/nim/nodem/nodem.nim(359)                        run
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208)  
processPendingCallbacks
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29)      
say_hiNimAsyncContinue
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145)     
say_hiIter
        /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372)   read
      ]#
      #[
        /alex/projects/nim/nodem/greeting_example/user.nim(14)         user
        /alex/projects/nim/nodem/nodem.nim(359)                        run
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1935) waitFor
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1627) poll
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(1368) runOnce
        /balex/applications/nim-1.4.2/lib/pure/asyncdispatch.nim(208)  
processPendingCallbacks
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(29)      
selfNimAsyncContinue
        /balex/applications/nim-1.4.2/lib/pure/asyncmacro.nim(145)     selfIter
        /balex/applications/nim-1.4.2/lib/pure/asyncfutures.nim(372)   read
      ]#
    Exception message: Timed out, connection closed
    Exception type: [Exception]
    Error: execution of an external program failed: 
'/alex/projects/nim/build/user '
    
    
    Run

P.S.

Eventually though, I hope Nim deprecate async and use better approaches, async 
is too low level and designed for machines, not humans, working with async is 
like writting C by hands.

Reply via email to