Nim:具有 void 返回类型的 lambda 会导致编译器崩溃

问题描述 投票:0回答:1

请参阅这个最小的示例:

import sugar

type TestLambda = () -> void
type NamedTestLambda = tuple[name: string, lambda: TestLambda]

var testNil: TestLambda = () => void


var funcs: seq[NamedTestLambda] = @[
    (name: "nil", lambda: testNil),
]

这会导致以下错误输出:

Error: internal error: getTypeDescAux(tyVoid)
No stack traceback available
To create a stacktrace, rerun compilation with './koch temp c <file>', see https://nim-lang.github.io/Nim/intern.html#debugging-the-compiler for details
     Error: Build failed for package: nim_snake
        ... Execution failed with exit code 256

当我们将返回类型更改为 int 时,代码似乎编译没有问题:

import sugar

type TestLambda = () -> int
type NamedTestLambda = tuple[name: string, lambda: TestLambda]

var testNil: TestLambda = () => 1


var funcs: seq[NamedTestLambda] = @[
    (name: "nil", lambda: testNil),
]

我应该向 nim 语言论坛报告这个问题,还是我在这里做错了什么?

Nim 1.6.16,编译为 C。

lambda closures nim-lang
1个回答
0
投票

我认为问题在于

testNil
变量,它返回
void
而不是仅仅用
discard
丢弃或不返回值。 根据 nim 论坛上的讨论 void 仅用于说明某些东西没有类型,并且如果用作 proc/func 中的返回值,则仅意味着该函数不返回值。在
var testnil: TestLambda = () => void
中使用它是错误的,应该是
var testnil: TestLambda = () => discard
甚至
var testnil: TestLambda = () => echo "void"
。 希望这有帮助

© www.soinside.com 2019 - 2024. All rights reserved.