feat(lang): layers - module flow in layer app uses base, items

The modules of one layer use each other freely and may go round;
anything outside the layer is held to the module's uses, and a layered
module with no uses reaches nothing outside it. The cycle check walks
the graph with each layer as one node, so a cycle leaving a layer is
refused. ludic deps shows the layers and counts the largest cycle
without their own edges. Reseed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-25 12:54:15 +03:00
parent e3219f17dd
commit 7b8c134c21
20 changed files with 47359 additions and 46193 deletions

View file

@ -0,0 +1,9 @@
# L3: a cycle is allowed inside a layer and nowhere else: items -> layer app -> items is refused
import "layer_cycle/items"
import "layer_cycle/menu"
import "layer_cycle/hud"
program LayerCycle {
entry {
print(menu_rows())
}
}

View file

@ -0,0 +1,5 @@
# hud/index.ludic - in layer app: it reaches menu back - a cycle, allowed inside the layer
module hud in layer app
export function hud_lines() -> int {
return menu_title() + 1
}

View file

@ -0,0 +1,5 @@
# items/index.ludic - uses hud, which is in layer app
module items uses hud
export function item_count() -> int {
return 3
}

View file

@ -0,0 +1,8 @@
# menu/index.ludic - in layer app: it reaches hud (same layer) freely, and items through its uses
module menu in layer app uses items
export function menu_rows() -> int {
return item_count() + hud_lines()
}
export function menu_title() -> int {
return 1
}

View file

@ -0,0 +1,9 @@
# L3: a layer frees the modules in it from naming each other, not from naming anything else
import "layer_reach/items"
import "layer_reach/menu"
import "layer_reach/hud"
program LayerReach {
entry {
print(menu_rows())
}
}

View file

@ -0,0 +1,5 @@
# hud/index.ludic - in layer app with no uses line: items is outside the layer, so it is refused
module hud in layer app
export function hud_lines() -> int {
return menu_title() + item_count()
}

View file

@ -0,0 +1,5 @@
# items/index.ludic - below the layer: it uses nothing
module items uses
export function item_count() -> int {
return 3
}

View file

@ -0,0 +1,8 @@
# menu/index.ludic - in layer app: it reaches hud (same layer) freely, and items through its uses
module menu in layer app uses items
export function menu_rows() -> int {
return item_count() + hud_lines()
}
export function menu_title() -> int {
return 1
}