Ошибка ссылки: не удается получить доступ к ‘LCharacter’ перед инициализацией

#javascript #es6-modules

Вопрос:

Я во второй попытке разделить свой проект на несколько модулей ES. И у меня эта ошибка:

Ошибка ссылки: не удается получить доступ к ‘LCharacter’ перед инициализацией

это трассировка стека:

 file:///mnt/ssd/projects/jcubic/lips/repo/src/typechecking.js:101
        'character': LCharacter,
                     ^

ReferenceError: Cannot access 'LCharacter' before initialization
    at type (file:///mnt/ssd/projects/jcubic/lips/repo/src/typechecking.js:101:22)
    at typecheck (file:///mnt/ssd/projects/jcubic/lips/repo/src/typechecking.js:30:22)
    at curry (file:///mnt/ssd/projects/jcubic/lips/repo/src/utils.js:364:5)
    at file:///mnt/ssd/projects/jcubic/lips/repo/src/utils.js:351:24
    at ModuleJob.run (node:internal/modules/esm/module_job:175:25)
    at async Loader.import (node:internal/modules/esm/loader:178:24)
    at async Object.loadESM (node:internal/process/esm_loader:68:5)
    at async handleMainPromise (node:internal/modules/run_main:63:12)
 

и то, что у меня есть, это в typechecking.js

 import LCharacter from './LCharacter.js';
// ...
function type(obj) {
    var mapping = {
        'pair': Pair,
        'symbol': LSymbol,
        'character': LCharacter,
        'values': Values,
        'input-port': InputPort,
        'output-port': OutputPort,
        'number': LNumber,
        'regex': RegExp,
        'syntax': Syntax,
        'macro': Macro,
        'string': LString,
        'array': Array,
        'native-symbol': Symbol
    };
    if (Number.isNaN(obj)) {
        return 'NaN';
    }
    if (obj === nil) {
        return 'nil';
    }
    if (obj === null) {
        return 'null';
    }
    for (let [key, value] of Object.entries(mapping)) {
        if (obj instanceof value) {
            return key;
        }
    }
    if (typeof obj === 'object') {
        if (obj.__instance__) {
            obj.__instance__ = false;
            if (obj.__instance__) {
                if (is_function(obj.toType)) {
                    return obj.toType();
                }
                return 'instance';
            }
        }
        if (obj.constructor) {
            if (obj.constructor.__class__) {
                return obj.constructor.__class__;
            }
            if (obj.constructor === Object) {
                if (is_iterator(obj, Symbol.iterator)) {
                    return 'iterator';
                }
                if (is_iterator(obj, Symbol.asyncIterator)) {
                    return 'async-iterator';
                }
            }
            return obj.constructor.name.toLowerCase();
        }
    }
    return typeof obj;
}
 

Но я utils.js У меня есть на самом верху:

 import {
    typecheck,
    type,
    is_null,
    is_function,
    is_bound,
    is_atom,
    is_lambda,
    is_plain_object,
    is_native_function,
    __fn__,
    __data__
} from './typechecking.js';
 

Весь код (с этой ошибкой) можно найти на GitHub: https://github.com/jcubic/lips/tree/es-modules

Почему у меня эта ошибка? Почему LCharacter не инициализируется, даже если это так?

Комментарии:

1. У вас есть циклический импорт? Вы должны реструктурировать, чтобы не иметь циклического импорта.

2. @Ry- если циклический импорт является проблемой, его будет проблематично исправить. Возможно, мне нужно снова отказаться от этого. Это действительно сложно сделать без таких зависимостей.