Mam problem na poziomie projektowym mojego języka:
Przypuszczalnie mamy trzy pliki:
main.ss
@("module.ss") // `@` to upraszczając odpowiednik `include` z C++
function<int> main()
{
module();
}
module.ss
@("module2.ss")
function<void> module()
{
module2();
}
module2.ss
@("module.ss")
function<void> module2()
{
module();
}
akurat ten kod nie ma większego sensu i jego uruchomienie skończyłoby się stack-overflowem, lecz chodzi tutaj o uproszczone przedstawienie sytuacji
Jak widać - pomiędzy plikami module.ss
oraz module2.ss
występuje wzajemna zależność: plik module.ss
wymaga funkcji module2
zadeklarowanej w pliku module2.ss
, a z kolei module2.ss
wymaga funkcji module
zadeklarowanej w module.ss
.
Myślałem nad rozwiązaniem tego w taki sposób, że jeżeli podczas includowania jakiegoś pliku wykryta zostanie wzajemna zależność, wykonam jedynie skan nagłówków funkcji w tym includowanym pliku, a nie będę go kompilował, lecz wydaje mi się, że prędzej czy później wyszłoby na to, że takie rozwiązanie ma więcej wad :P
Dla przykładu, w Pascalu tego problemu nie ma, ponieważ moduł jest podzielony na dwie sekcje - interface
oraz implementation
i myślałem nad wprowadzeniem czegoś podobnego, lecz doskwiera brak pomysłów :/
Pytanie właściwe: w jaki sposób rozwiązać ten problem (pomijamy oczywiście to, że user może w tym konkretnym przypadku po prostu połączyć te dwa moduły w jeden)?