Как я могу использовать указатели функций в Nimrod?

Можно ли использовать указатели функций в Nimrod?

Что я пробовал это:

type fptr = (proc(int):int)

proc f(x:int): int = 
  result = x+1

var myf : fptr = f

echo myf(0)

но когда я пытаюсь скомпилировать, я получаю:

Hint: added path: 'C:\Users\Peter\.babel\pkgs\' [Path]
Hint: used config file 'C:\Program Files (x86)\Nimrod\config\nimrod.cfg' [Conf]
Hint: system [Processing]
Hint: hello3 [Processing]
Error: internal error: GetUniqueType
Traceback (most recent call last)
nimrod.nim               nimrod
nimrod.nim               handleCmdLine
main.nim                 mainCommand
main.nim                 commandCompileToC
modules.nim              compileProject
modules.nim              compileModule
passes.nim               processModule
passes.nim               processTopLevelStmt
cgen.nim                 myProcess
ccgstmts.nim             genStmts
ccgexprs.nim             expr
ccgstmts.nim             genStmts
ccgexprs.nim             expr
ccgstmts.nim             genVarStmt
ccgstmts.nim             genSingleVar
cgen.nim                 assignGlobalVar
ccgtypes.nim             getTypeDesc
ccgtypes.nim             getTypeDescAux
ccgtypes.nim             genProcParams
cgen.nim                 fillLoc
ccgutils.nim             getUniqueType
msgs.nim                 internalError
msgs.nim                 rawMessage
msgs.nim                 rawMessage
msgs.nim                 handleError

1 ответ

Решение

Конечно, вы можете использовать указатели, единственная проблема в том, что вы забыли определить имя первого параметра, и, к сожалению, это приводит к сбою компилятора. Следующий пример работает:

type fptr = (proc(x: int):int)

proc f(x:int): int = 
  result = x+1

var myf : fptr = f

echo myf(0)

Обратите внимание, что вы можете опустить тип в myf объявление переменной. Вы также можете опустить скобки вокруг определения типа proc. Я сообщил об ошибке, которую вы обнаружили разработчикам по адресу https://github.com/Araq/Nimrod/issues/1183.

Другие вопросы по тегам