В юности я в основном писал на Паскале.
Там всё просто: ты пишешь
interface uses file1,file2;
После этого тебе доступны все имена, проэкспортированные в файлах (модулях) file1.pas и file2.pas. Если есть конфликт имён, то возьмётся первое попавшееся имя (стандарт вроде бы не даёт гарантий, что из file1). Но ты можешь написать file1.clashing_name и компилятор поймёт.
Всё было просто и устраивало. Потом я стал гораздо больше писать на лиспе и оказалось, что я трачу кучу времени и сил на управление пространствами имён, и всё никак не могу управиться.
В SQL есть иной способ сложения пространств имён. Там пространства имён для кляузы select образуются в каждом запросе.
select unique1,unique2,t1.clashing_name from table1 as t1, table2
Уникальные имена можно писать без префикса, а для тех, которые есть и в table1, и в table2, нужно указать префикс, иначе ошибка компиляции. Причём в запросе можно также назначить локальный псевдоним для имени таблицы.
Я хочу в своём языке применить именно этот способ сложения пространств имён. Собственно, я уже давно сделал свой макрос для определения пр-в имён, в котором эта возможность реализована, и пользуюсь им:
Но я смотрю, что в современных языках есть возможность импортировать символы по одному. Её я хочу исключить. Мотивация такова: это трудоёмко в поддержке. Если оказывается, что при импорте нужна только небольшая доля экспортируемых символов, то значит, у нас просто слишком большой модуль, который следует разбить на части.
Во время написания слов
from the_lib import symbol1, symbol2;
Это может быть нам полезно только при написании клиента (мы не сможем сослаться на лишнее). Но если мы попытаемся анализировать граф зависимостей модулей в нашей системы, то мы либо утонем в море конкретных символов, либо информация будет потеряна, либо нам придётся иметь дело с анонимными подмодулями, а это неудобно.
Если уж нужно создать подмодуль, то должна быть отдельная операция создания именованного модуля some_subset_of_the_lib, который только импортирует два символа из the_lib, а затем экспортирует их. В sql это делается через view.
Но пока я не планирую включать операцию сужения модуля в свой язык - ведь я как-то раньше работал на Паскале и спокойно без этого обходился.
Ругайте, а лучше хвалите подобный ход мыслей.