调用编译时proc isObject报错:request to generate code for .compileTime proc原因解析
Nim编译时proc调用报错原因及解决
问题场景
我写了一个编译时判断类型是否为对象类型的辅助proc:
func isObject*[T](val: typedesc[T]): bool {.compileTime.} = T is (object or ref object)
调用如下代码时触发错误:
type A = object echo isObject(A)
错误提示:
Error: request to generate code for .compileTime proc: isObject
预期应该输出true,为什么会报错?
错误原因
核心问题是你在运行时上下文里直接调用了仅支持编译时执行的proc。
Nim中标记{.compileTime.}的proc只能在编译阶段运行,用来生成编译期常量,不会生成对应的运行时代码。而echo是运行时执行的语句,当你直接写echo isObject(A)时,编译器会把isObject(A)当作运行时表达式处理,但这个proc没有运行时实现,所以就抛出了找不到代码的错误。
解决方法
有两种可行的修正方式:
- 用
static强制表达式在编译时求值,将结果转为运行时常量:type A = object echo static(isObject(A)) - 把proc改为
constproc(Nim 1.4及以上版本支持),这样它既能在编译时执行,也能在运行时被调用(只要参数是编译期可知的):const isObject*[T](val: typedesc[T]): bool = T is (object or ref object) type A = object echo isObject(A)
内容的提问来源于stack exchange,提问作者Philipp Doerner
相关产品推荐
相关产品推荐

