【发布时间】:2020-01-16 05:32:25
【问题描述】:
下面的do/a宏可以在使用asyncio函数时自动插入await。
下面也展示了用法。
(import asyncio)
(import time)
(defmacro do/a [&rest code]
`(do ~@(lfor p code
(if
(= (cut (str (first p)) -2) "/a")
`(await ~p)
p))))
(defmacro progn/a [&rest code]
`(.run_until_complete (.get-event-loop asyncio )
((fn/a []
(do/a ~@code)
))
))
(defn/a sleep_test/a [t]
(await (asyncio.sleep t))
(print t)
t)
(defn sleep_test [t]
(time.sleep t)
(print t)
t)
(progn/a
(print 3)
(await (sleep_test/a 3))
(sleep_test/a 2) ;;can omit await
(sleep_test 1) ;;auto swich by fn name
(+ 20 30)
)
此宏通过函数名“/a”检测异步函数。
最好使用asyncio.iscoroutinefunction 来检测异步函数。
但这不起作用。
请看下面的宏和执行结果。
(defmacro isasynctestmac [f]
(if (asyncio.iscoroutinefunction f)
`["async" ~(asyncio.iscoroutinefunction f) (asyncio.iscoroutinefunction ~f) (type ~f)]
`["not async" ~(asyncio.iscoroutinefunction f) (asyncio.iscoroutinefunction ~f) (type ~f)]
))
(isasynctestmac sleep_test/a)
==> ['not async', False, True, <class 'function'>]
你会看到一个异步函数在 hy-lang 宏中被视为一个符号。
申请eval也无法避免这个问题。
如何解决这个问题?
【问题讨论】: