元组中的 Nim 存储过程引用
Nim stored procedure reference in tuple
Nim Compiler Version 0.13.0 (2016-01-19) [Windows: i386]
如何在元组中存储对过程的引用:
Job = tuple[every:int, timescale:string, timestr:string, jobfunc:proc]
proc run(job: Job, jobfunc: proc): Job =
result = job
result.jobfunc = addr jobfunc
在 运行 proc jobfunc: proc 被接受。在元组中我得到:
Error: 'proc' is not a concrete type.
那么 proc 的类型是什么?
[编辑]
我的最终目标是将具有任意参数的函数传递给 run
。
Atm 我已经设法通过使用 seq[string]
解决了这个问题,但也许有人知道一种更通用的方法。
type
Job = tuple[every:int, timescale:string, timestr:string, jobfunc: proc(args:seq[string]) {.gcsafe, locks: 0.}]
proc run(job: Job, jobfunc: proc,args:seq[string]= @[""] ): Job =
# ...
discard
proc myfunc(args:seq[string]) =
echo "hello from myfunc ", args
discard
schedule every(10).seconds.run(myfunc,args= @["foo","uggar"])
有不同的 proc 类型,例如 proc: int
、proc(x: int): string
,在您的情况下这应该有效:
type Job = tuple[every: int, timescale, timestr: string, jobfunc: proc()]
指定 jobfunc
是一个不带任何参数且 returns 没有任何参数的过程。
在不失去编译时类型安全性的情况下,不可能以非泛型方式存储对接受任何参数组合的 proc 的引用。如果你真的需要它(在你的情况下很可能你不需要),你应该使用诸如带有运行时类型检查的变体类型之类的东西。但是,对于您的情况来说,这看起来有点矫枉过正。我不认为你必须存储用户提供给他的过程的参数,而是存储一个没有参数的过程(闭包),允许你的用户将他的参数包装在一个闭包中。
基本上,将您的 run
重写为:
proc run(job: Job, jobfunc: proc()): Job =
# ...
现在您的用户会做:
proc myfunc(args:seq[string]) =
echo "hello from myfunc ", args
discard
var myArgs = @["foo","uggar"]
schedule every(10).seconds.run do(): # Do is a sugar for anonymous closure in this context
myfunc(myArgs)
Nim Compiler Version 0.13.0 (2016-01-19) [Windows: i386]
如何在元组中存储对过程的引用:
Job = tuple[every:int, timescale:string, timestr:string, jobfunc:proc]
proc run(job: Job, jobfunc: proc): Job =
result = job
result.jobfunc = addr jobfunc
在 运行 proc jobfunc: proc 被接受。在元组中我得到:
Error: 'proc' is not a concrete type.
那么 proc 的类型是什么?
[编辑]
我的最终目标是将具有任意参数的函数传递给 run
。
Atm 我已经设法通过使用 seq[string]
解决了这个问题,但也许有人知道一种更通用的方法。
type
Job = tuple[every:int, timescale:string, timestr:string, jobfunc: proc(args:seq[string]) {.gcsafe, locks: 0.}]
proc run(job: Job, jobfunc: proc,args:seq[string]= @[""] ): Job =
# ...
discard
proc myfunc(args:seq[string]) =
echo "hello from myfunc ", args
discard
schedule every(10).seconds.run(myfunc,args= @["foo","uggar"])
有不同的 proc 类型,例如 proc: int
、proc(x: int): string
,在您的情况下这应该有效:
type Job = tuple[every: int, timescale, timestr: string, jobfunc: proc()]
指定 jobfunc
是一个不带任何参数且 returns 没有任何参数的过程。
在不失去编译时类型安全性的情况下,不可能以非泛型方式存储对接受任何参数组合的 proc 的引用。如果你真的需要它(在你的情况下很可能你不需要),你应该使用诸如带有运行时类型检查的变体类型之类的东西。但是,对于您的情况来说,这看起来有点矫枉过正。我不认为你必须存储用户提供给他的过程的参数,而是存储一个没有参数的过程(闭包),允许你的用户将他的参数包装在一个闭包中。
基本上,将您的 run
重写为:
proc run(job: Job, jobfunc: proc()): Job =
# ...
现在您的用户会做:
proc myfunc(args:seq[string]) =
echo "hello from myfunc ", args
discard
var myArgs = @["foo","uggar"]
schedule every(10).seconds.run do(): # Do is a sugar for anonymous closure in this context
myfunc(myArgs)