我可以解压 `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)

https://play.nim-lang.org/#ix=3rwM