The async macro now supports transforming multiple async procs.
This is a workaround for #3182, no forward declarations. You can now do this: ```nim async: proc bar(): Future[T] proc foo() = await bar() proc bar() {.async.} = echo(123); await foo() ```
This commit is contained in:
parent
b9c1dd0072
commit
202cc48903
1 changed files with 18 additions and 7 deletions
|
|
@ -124,7 +124,8 @@ export Port, SocketFlag
|
||||||
##
|
##
|
||||||
## * The effect system (``raises: []``) does not work with async procedures.
|
## * The effect system (``raises: []``) does not work with async procedures.
|
||||||
## * Can't await in a ``except`` body
|
## * Can't await in a ``except`` body
|
||||||
|
## * Forward declarations for async procs are broken,
|
||||||
|
## link includes workaround: https://github.com/nim-lang/Nim/issues/3182.
|
||||||
|
|
||||||
# TODO: Check if yielded future is nil and throw a more meaningful exception
|
# TODO: Check if yielded future is nil and throw a more meaningful exception
|
||||||
|
|
||||||
|
|
@ -1412,12 +1413,12 @@ proc getName(node: NimNode): string {.compileTime.} =
|
||||||
else:
|
else:
|
||||||
error("Unknown name.")
|
error("Unknown name.")
|
||||||
|
|
||||||
macro async*(prc: stmt): stmt {.immediate.} =
|
proc asyncSingleProc(prc: NimNode): NimNode {.compileTime.} =
|
||||||
## Macro which processes async procedures into the appropriate
|
## This macro transforms a single procedure into a closure iterator.
|
||||||
## iterators and yield statements.
|
## The ``async`` macro supports a stmtList holding multiple async procedures.
|
||||||
if prc.kind notin {nnkProcDef, nnkLambda}:
|
if prc.kind notin {nnkProcDef, nnkLambda}:
|
||||||
error("Cannot transform this node kind into an async proc." &
|
error("Cannot transform this node kind into an async proc." &
|
||||||
" Proc definition or lambda node expected.")
|
" Proc definition or lambda node expected.")
|
||||||
|
|
||||||
hint("Processing " & prc[0].getName & " as an async proc.")
|
hint("Processing " & prc[0].getName & " as an async proc.")
|
||||||
|
|
||||||
|
|
@ -1504,9 +1505,19 @@ macro async*(prc: stmt): stmt {.immediate.} =
|
||||||
result[6] = outerProcBody
|
result[6] = outerProcBody
|
||||||
|
|
||||||
#echo(treeRepr(result))
|
#echo(treeRepr(result))
|
||||||
if prc[0].getName == "getAsync":
|
if prc[0].getName == "hubConnectionLoop":
|
||||||
echo(toStrLit(result))
|
echo(toStrLit(result))
|
||||||
|
|
||||||
|
macro async*(prc: stmt): stmt {.immediate.} =
|
||||||
|
## Macro which processes async procedures into the appropriate
|
||||||
|
## iterators and yield statements.
|
||||||
|
if prc.kind == nnkStmtList:
|
||||||
|
for oneProc in prc:
|
||||||
|
result = newStmtList()
|
||||||
|
result.add asyncSingleProc(oneProc)
|
||||||
|
else:
|
||||||
|
result = asyncSingleProc(prc)
|
||||||
|
|
||||||
proc recvLine*(socket: AsyncFD): Future[string] {.async.} =
|
proc recvLine*(socket: AsyncFD): Future[string] {.async.} =
|
||||||
## Reads a line of data from ``socket``. Returned future will complete once
|
## Reads a line of data from ``socket``. Returned future will complete once
|
||||||
## a full line is read or an error occurs.
|
## a full line is read or an error occurs.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue