Nim 中函数参数的元组
Tuple to function arguments in Nim
我可以在 Nim 中将元组转换为函数参数列表吗?在其他语言中,这称为 "splat" 或 "apply"。
例如:
proc foo(x: int, y: int) = echo("Yes you can!")
type:
Point = tuple[x, y: int]
let p: Point = (1,1)
# How to call foo with arguments list p?
我没有在 stdlib 或任何其他库中看到这个,但是你当然可以自己用宏来做:
import macros
macro apply(f, t: typed): typed =
var args = newSeq[NimNode]()
let ty = getTypeImpl(t)
assert(ty.typeKind == ntyTuple)
for child in ty:
expectKind(child, nnkIdentDefs)
args.add(newDotExpr(t, child[0]))
result = newCall(f, args)
proc foo(x: int, y: int) = echo("Yes you can!")
type Point = tuple[x, y: int]
let p: Point = (1,1)
# How to call foo with arguments list p?
apply(foo, p) # or:
foo.apply(p)
需要进一步测试以确保它适用于嵌套元组、对象等。您可能还想将参数存储在临时变量中,以防止多次调用它以获取每个元组成员的副作用。
我可以在 Nim 中将元组转换为函数参数列表吗?在其他语言中,这称为 "splat" 或 "apply"。
例如:
proc foo(x: int, y: int) = echo("Yes you can!")
type:
Point = tuple[x, y: int]
let p: Point = (1,1)
# How to call foo with arguments list p?
我没有在 stdlib 或任何其他库中看到这个,但是你当然可以自己用宏来做:
import macros
macro apply(f, t: typed): typed =
var args = newSeq[NimNode]()
let ty = getTypeImpl(t)
assert(ty.typeKind == ntyTuple)
for child in ty:
expectKind(child, nnkIdentDefs)
args.add(newDotExpr(t, child[0]))
result = newCall(f, args)
proc foo(x: int, y: int) = echo("Yes you can!")
type Point = tuple[x, y: int]
let p: Point = (1,1)
# How to call foo with arguments list p?
apply(foo, p) # or:
foo.apply(p)
需要进一步测试以确保它适用于嵌套元组、对象等。您可能还想将参数存储在临时变量中,以防止多次调用它以获取每个元组成员的副作用。