Есть несколько проблем с кодом, но давайте попробуем расшифровать ошибку компилятора: Таблица [A, B] 'внутри определения типа:' lex '; Может быть, отсутствуют общие аргументы c? .
Nim имеет вывод типа, но допустим, что он объявлен вперед и в первый момент завершается неудачно, что-то неизвестно. В этом случае компилятор просматривает ваш файл main.nim
и видит, что вы хотите вызвать профи c со следующей подписью:
proc lex*(code: string): Table
Это все , которые он видит и поскольку Table
является универсальным c типом , он не может создать экземпляр возвращаемого типа, поскольку не знает, какими должны быть универсальные c типы A
или B
, основываясь только на профессиональной подписи c. Вот на что жалуется компилятор. Можно утверждать, что компилятор может попытаться заглянуть в pro c и выяснить специфицированный тип c сигнатуры generi c, но это потребует больше работы над частью компилятора и замедлит время компиляции, metri c сообщество Nim заботится о многом.
Есть два способа исправить это: простой, который объявляет типы в подписи pro c, и сложный, который требует Вы должны указать типы у вызывающей стороны. Первый вопрос заключается в том, чтобы изменить подпись pro c на следующую:
proc lex*(code: string): Table[string, string]
Второй - указать тип у вызывающей стороны, что означает изменение кода main.nim
на следующий:
echo lexer.lex[Table[string, string]]("hi")
К сожалению, это второе решение также не скомпилируется, поскольку модуль main.nim
теперь не имеет ничего общего с типом Table
: Ошибка: необъявленный идентификатор: 'Table' . Чтобы продолжать использовать это решение, вам необходимо либо экспортировать тип Table
из lexer.nim
, добавив оператор экспорта в этот модуль , либо импортировать модуль tables
в main.nim
(и любые другие другие будущие вызывающие модули).