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.