Пытался написать лексер на Ниме. Извините, если это звучит немного идиотично, потому что я начал использовать nim вчера, моя проблема в том, что я создал такой тип, как следующий

import position

type
  Error* = object
    pos_start : position.Position
    pos_end : position.Position
    name: string
    details: string

Затем я продолжил создание процедуры, которая возвращает экземпляр этого типа,

proc IllegalCharacterError*(pos_start : position.Position, pos_end : position.Position, details : string) : Error =
  return Error(pos_start: pos_start, pos_end: pos_end, name: "IllegalCharacterError", details: details)

Теперь все работает нормально, за исключением случаев, когда я из другого модуля пытаюсь получить доступ к полям этого возвращенного экземпляра, я получаю сообщение об ошибке

from errors import nil
from position import nil

var current_char = "2"
let pos = position.Position(idx: -1, ln: 0, col: -1, fn: fn, ftxt: text)
let error = errors.IllegalCharacterError(pos, pos, current_char)
echo error.name

Последняя строка - это та, которая вызывает ошибку, а следующая - ошибка, появившаяся во время компиляции.

Error: undeclared field: 'name' for type errors.Error [declared in C:\Users\Mlogix\Desktop\testNim\errors.nim(4, 3)]

Спасибо, любая помощь будет очень признательна.

0
Tecnical Compute 14 Июн 2020 в 09:48

1 ответ

Лучший ответ

Хорошо, наконец, через час я понял, что мои поля не были общедоступными. Для всех из будущего я изменил свой код типа на

import position

type
  Error* = object
    pos_start* : position.Position
    pos_end* : position.Position
    name*: string
    details*: string

И это сработало. Ура.

2
Tecnical Compute 16 Июн 2020 в 06:35