已解决 - 在 nim 中声明程序原型

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

我正在尝试了解如何在 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 中的第一个代码)。例如,有一篇关于在窗口过程中分配函数指针的文章,但对我来说没有帮助。

compiler-errors forward-declaration nim-lang
1个回答
1
投票

您可以为此转发声明程序!

这里有一个最小的例子来演示:

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 的官方教程也有一节介绍了这一点。

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