gpt4 book ai didi

nim-lang - 我可以解压缩 `varargs` 以用作 nim 的单个过程调用参数吗?

转载 作者:行者123 更新时间:2023-12-04 13:08:35 24 4
gpt4 key购买 nike

我需要打开 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 解压参数序列将它们用作不接受的不同过程调用的单独参数 varargs .
假设我试图解压缩一系列参数以创建一个可以运行任何任意过程(具有任意数量的参数)的过程,并告诉用户运行所述过程需要多长时间。我不想写我所有的程序来接受 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 很陌生,所以我在围绕正确的方法来做这件事时遇到了一些困难。

最佳答案

unpackVarargs 来自 macros标准库。

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 )..它使用 varargs[untyped]输入 timeIt模板代替:
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

关于nim-lang - 我可以解压缩 `varargs` 以用作 nim 的单个过程调用参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68186716/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com