我正在尝试了解如何在 nim 源中声明相互调用的不同过程,因为听起来编译器希望所有调用都在声明之后进行,但过程不能全部位于顶部,所以编译器将无法识别源代码中较低的部分,并会引发错误。 现阶段我不想编写面向对象的代码,因为我的编程经验很少。
以下是一个例子:
proc mydouble(num: int): int =
echo "Warning, someone is trying to double a number, which is forbidden by law!"
echo "I will allow it for now, but I filed it under the capital crimes register."
return mymultiply(num, 2)
proc mysum(firstnum, secondnum: int): int =
if firstnum==secondnum:
return mydouble(firstnum)
else:
return firstnum + secondnum
proc mymultiply(firstnum, secondnum: int): int =
if firstnum == 2:
return mydouble(secondnum)
elif secondnum == 2:
return mydouble(firstnum)
else:
var res=0
for x in 1..secondnum:
res=mysum(res,firstnum)
return res
var a,b,c: int
a = 3
b = 2
c = -1
c=mydouble(a)
echo c # expecting 6, with a warning about crime.
c=mysum(a,b)
echo c # expecting 5
c=mysum(a-1,b)
echo c # expecting 4, with a warning about crime.
c=mymultiply(a,a)
echo c # expecting 9
c=mymultiply(a,b)
echo c # expecting 6, with a warning about crime.
结果是:
./test.nim(5, 10) 错误:未声明的标识符:'mymultiply' 候选者(编辑距离、范围距离);请参阅“--spellSuggest”: (7, 1): '结果' (7, 2): 'mydouble' (7, 4): '计数'
如果我将 mymultiply 放在 mydouble 之上,我会得到:
./test.nim(4, 12) 错误:未声明的标识符:'mydouble' 候选者(编辑距离、范围距离);请参阅“--spellSuggest”: (2, 5): 'cdouble'
有没有办法警告编译器缺少的代码在下面几行(例如,带有原型声明或前向声明)?我在 nim 中找不到任何方法可以做到这一点。有没有?请问我该怎么做?预先感谢。
我所有的搜索结果都是同样的几个网站,这些网站只提供一些参考资料(没有现实生活中的解释)或论坛问题,其中包含许多具体细节,使其无关紧要且过于复杂(我不是程序员,我只获得了非常基本的使用经验用于几个程序的更简单的语言,这是我在 nim 中的第一个代码)。例如,有一篇关于在窗口过程中分配函数指针的文章,但对我来说没有帮助。
您可以为此转发声明程序!
这里有一个最小的例子来演示:
proc procOne(x: string)
proc procTwo(y: string) =
echo "Defined before one!"
procOne(y)
proc procOne(x: string) =
echo "Defined after two!"
echo x
procTwo("Last!")
nim 的官方教程也有一节介绍了这一点。