2016-08-30 10 views
3

Nim Compiler Version 0.13.0 (2016-01-19) [Windows: i386]Nim хранится ссылка процедура в кортеже

Как бы я хранить ссылку на процедуру в кортеже:

Job = tuple[every:int, timescale:string, timestr:string, jobfunc:proc] 

proc run(job: Job, jobfunc: proc): Job = 
    result = job 
    result.jobfunc = addr jobfunc 

В перспективе Proc jobfunc: Учеб получает принято. В кортеже я получаю:

Error: 'proc' is not a concrete type.

Так что же такое тип proc?

[править]

Моя конечная цель состоит в том, чтобы передать функции с произвольными параметрами для run.

Atm Мне удалось обойти это, используя seq[string], но, возможно, он знает более общий способ.

type 
    Job = tuple[every:int, timescale:string, timestr:string, jobfunc: proc(args:seq[string]) {.gcsafe, locks: 0.}] 


proc run(job: Job, jobfunc: proc,args:seq[string]= @[""]): Job = 
    # ... 
    discard 


proc myfunc(args:seq[string]) = 
    echo "hello from myfunc ", args 
    discard 

schedule every(10).seconds.run(myfunc,args= @["foo","uggar"])  

ответ

5

Хранение ссылки на proc, принимающее любую комбинацию аргументов нестандартным способом, невозможно без потери безопасности типа компиляции. Если вам это действительно нужно (в вашем случае, скорее всего, вы этого не сделаете), вы должны использовать что-то вроде типов вариантов с проверками типа времени выполнения. Однако это выглядит излишним для вашего дела. Я не думаю, что вам нужно хранить аргументы, которые пользователь предоставляет для своего proc, а скорее хранить proc (закрытие) без аргументов, позволяя вашему пользователю обернуть свои аргументы в закрытии. В основном, переписать run-л, как:

proc run(job: Job, jobfunc: proc()): Job = 
    # ... 

Теперь ваш пользователь должен сделать следующее:

proc myfunc(args:seq[string]) = 
    echo "hello from myfunc ", args 
discard 

var myArgs = @["foo","uggar"] 

schedule every(10).seconds.run do(): # Do is a sugar for anonymous closure in this context 
    myfunc(myArgs) 
3

Существуют различные типы Учеб, как proc: int, proc(x: int): string, в вашем случае это должно работать:

type Job = tuple[every: int, timescale, timestr: string, jobfunc: proc()] 

Это указывает, что jobfunc является прок, который не принимает никаких аргументов и ничего не возвращает.

+0

эй пропи смотрите мою редактировать. – enthus1ast