我可以解压 `varargs` 以用作 nim 的单独过程调用参数吗?
Can I unpack `varargs` to use as individual procedure call arguments with nim?
我需要从过程的输入中解压 varargs
以用作过程的各个参数..
在 python 中,您可以像这样“解压缩”函数调用的参数列表:
def fun(a, b, c, d):
print(a, b, c, d)
my_list = [1, 2, 3, 4]
# Unpacking list into four arguments
fun(*my_list) # asterisk does the unpacking
因此列表中的每一项都用作函数调用中的单独参数。
这可以在 nim 中实现吗?我知道您可以使用 varargs
接受任意数量的过程参数,但我想从 varargs
中解压参数序列,将它们用作不接受 [=] 的不同过程调用的单独参数12=].
假设我正在尝试解压缩一系列参数以创建一个过程,该过程可以 运行 任何任意过程(具有任意数量的参数)并告诉用户 运行表示程序。我不想编写所有程序来接受 varargs
类型,因此如果可能的话,解压序列将是最好的解决方案。
import times
proc timeit*[T] (the_func: proc, passed_args: varargs[T]): float =
let t = cpuTime()
var the_results = the_func(passed_args) # This is where I need to unpack arguments
cpuTime() - t
proc test_func(x: int, y: int): int =
x + y
echo timeit(test_func, 15, 5)
我知道这段代码不正确,而且我对 nim 很陌生,所以我在思考正确的方法时遇到了一些困难。
请参阅 macros
stdlib 中的 unpackVarargs
。
import std/[times, macros]
template timeIt*(theFunc: proc, passedArgs: varargs[typed]): float =
let t = cpuTime()
echo unpackVarargs(theFunc, passedArgs)
cpuTime() - t
proc add2(arg1, arg2: int): int =
result = arg1 + arg2
proc add3(arg1, arg2, arg3: float): float =
result = arg1 + arg2 + arg3
echo timeIt(add2, 15, 5)
echo timeIt(add3, 15.5, 123.12, 10.009)
https://play.nim-lang.org/#ix=3rwD
这是一个甚至不需要 unpackVarargs
的替代答案(来源:GitHub @timotheecour)。它使用 timeIt
模板中的 varargs[untyped]
类型:
import std/[times]
template timeIt*(theFunc: proc, passedArgs: varargs[untyped]): float =
let t = cpuTime()
echo theFunc(passedArgs)
cpuTime() - t
proc add2(arg1, arg2: int): int =
result = arg1 + arg2
proc add3(arg1, arg2, arg3: float): float =
result = arg1 + arg2 + arg3
echo timeIt(add2, 15, 5)
echo timeIt(add3, 15.5, 123.12, 10.009)
我需要从过程的输入中解压 varargs
以用作过程的各个参数..
在 python 中,您可以像这样“解压缩”函数调用的参数列表:
def fun(a, b, c, d):
print(a, b, c, d)
my_list = [1, 2, 3, 4]
# Unpacking list into four arguments
fun(*my_list) # asterisk does the unpacking
因此列表中的每一项都用作函数调用中的单独参数。
这可以在 nim 中实现吗?我知道您可以使用 varargs
接受任意数量的过程参数,但我想从 varargs
中解压参数序列,将它们用作不接受 [=] 的不同过程调用的单独参数12=].
假设我正在尝试解压缩一系列参数以创建一个过程,该过程可以 运行 任何任意过程(具有任意数量的参数)并告诉用户 运行表示程序。我不想编写所有程序来接受 varargs
类型,因此如果可能的话,解压序列将是最好的解决方案。
import times
proc timeit*[T] (the_func: proc, passed_args: varargs[T]): float =
let t = cpuTime()
var the_results = the_func(passed_args) # This is where I need to unpack arguments
cpuTime() - t
proc test_func(x: int, y: int): int =
x + y
echo timeit(test_func, 15, 5)
我知道这段代码不正确,而且我对 nim 很陌生,所以我在思考正确的方法时遇到了一些困难。
请参阅 macros
stdlib 中的 unpackVarargs
。
import std/[times, macros]
template timeIt*(theFunc: proc, passedArgs: varargs[typed]): float =
let t = cpuTime()
echo unpackVarargs(theFunc, passedArgs)
cpuTime() - t
proc add2(arg1, arg2: int): int =
result = arg1 + arg2
proc add3(arg1, arg2, arg3: float): float =
result = arg1 + arg2 + arg3
echo timeIt(add2, 15, 5)
echo timeIt(add3, 15.5, 123.12, 10.009)
https://play.nim-lang.org/#ix=3rwD
这是一个甚至不需要 unpackVarargs
的替代答案(来源:GitHub @timotheecour)。它使用 timeIt
模板中的 varargs[untyped]
类型:
import std/[times]
template timeIt*(theFunc: proc, passedArgs: varargs[untyped]): float =
let t = cpuTime()
echo theFunc(passedArgs)
cpuTime() - t
proc add2(arg1, arg2: int): int =
result = arg1 + arg2
proc add3(arg1, arg2, arg3: float): float =
result = arg1 + arg2 + arg3
echo timeIt(add2, 15, 5)
echo timeIt(add3, 15.5, 123.12, 10.009)