#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- если циклический импорт является проблемой, его будет проблематично исправить. Возможно, мне нужно снова отказаться от этого. Это действительно сложно сделать без таких зависимостей.