Three limitations, and the same program wanted all three gone. An imported package's own imports were refused by name. They are resolved now, and the qualification flattens to the inner alias: raylib imported by a package that is itself imported is still rl/..., never sand/rl/.... That is forced, not chosen — a directory reached along two routes has to arrive under one set of names or the checker sees every declaration twice — and it is what lets the dedupe work. A directory is keyed by its real path and read once, which also ends a cycle: a package that imports itself meets its own entry and contributes nothing the second time, and since the namespace is flat, mutually dependent packages simply work. The same directory under two different aliases is refused, because both cannot be true at once. main is not exported. A package carrying one would collide with the importer's the moment anything imported it, so a program could never be a package; and main is a root, so an imported one keeps everything it calls reachable — for a raylib front-end, the whole library, on the target that cannot link it. Writing sand/main is refused at the line that wrote it rather than left to the checker, which would only say the name is unknown. That is true and useless: the name is missing on purpose and the message should say which purpose. A package that calls its own main is refused too — it would silently get the importer's. And a package may be a single .flan file named outright. sand.flan shares the repository root with three other loose programs, so naming its directory would import all four; moving it into a directory of its own would be arranging the tree around a limitation. A file carries no .c and no link file — those belong to a directory, and a package that needs them has one.
Description
Languages
OCaml
67.2%
Emacs Lisp
15.2%
C
10.4%
HTML
2.9%
Standard ML
2.8%
Other
1.5%