Don't load files twice

This commit is contained in:
2020-12-10 12:38:33 -07:00
parent 2da6e032da
commit 1ae7bca8c2

View File

@@ -24,7 +24,8 @@ typedef KissState = {
fieldForms:Map<String, FieldFormFunction>, fieldForms:Map<String, FieldFormFunction>,
specialForms:Map<String, SpecialFormFunction>, specialForms:Map<String, SpecialFormFunction>,
macros:Map<String, MacroFunction>, macros:Map<String, MacroFunction>,
wrapListExps:Bool wrapListExps:Bool,
loadedFiles:Map<String, Bool>
}; };
class Kiss { class Kiss {
@@ -37,7 +38,8 @@ class Kiss {
fieldForms: FieldForms.builtins(), fieldForms: FieldForms.builtins(),
specialForms: SpecialForms.builtins(), specialForms: SpecialForms.builtins(),
macros: Macros.builtins(), macros: Macros.builtins(),
wrapListExps: true wrapListExps: true,
loadedFiles: new Map<String, Bool>()
}; };
// Helpful aliases // Helpful aliases
@@ -73,9 +75,12 @@ class Kiss {
// (load... ) is the specialest of forms because it calls build() again and those fields need to be merged // (load... ) is the specialest of forms because it calls build() again and those fields need to be merged
case CallExp({pos: _, def: Symbol("load")}, [{pos: _, def: StrExp(otherKissFile)}]): case CallExp({pos: _, def: Symbol("load")}, [{pos: _, def: StrExp(otherKissFile)}]):
var filePath = Path.join([loadingDirectory, otherKissFile]); var filePath = Path.join([loadingDirectory, otherKissFile]);
var loadedFields = Kiss.build(filePath, k); if (!k.loadedFiles.exists(filePath)) {
for (field in loadedFields) { var loadedFields = Kiss.build(filePath, k);
classFields.push(field); for (field in loadedFields) {
classFields.push(field);
}
k.loadedFiles[filePath] = true;
} }
default: default:
var field = readerExpToField(nextExp, k); var field = readerExpToField(nextExp, k);