Limitations¶
This page is the honest scope of the prototype. Everything below is a deliberate boundary, and most cases are rejected with a clear error at definition time rather than miscompiled.
Communication stays scalar¶
copy/move/narrow/lift take scalar (agreement) operands only. You
cannot send a distributed tuple in one message — unpack it, move the parts, and
repack. Each element already lives at its role, so this is rarely a real cost.
Operands and guards are variables¶
The DSL reads things by name:
copy/move/narrow/packoperands must be choreographic variables;if/matchsubjects must be variables (writebig = x >= 10first);returnvalues must be variables.
This keeps the projection deterministic (the analyzer needs to know where each value lives). It is a spelling constraint, not a semantic one.
match patterns¶
Only constant patterns and the _ wildcard are supported. Match guards,
OR-patterns, structure patterns, and named captures are rejected.
Loops¶
whilerequires the condition to be located at some role(s) — an agreement condition loops lockstep, a subset-located one broadcasts (see Loops). A condition no single role can evaluate is rejected.break/continuework in lockstep loops only; both are rejected inside broadcast loops (the token protocol cannot absorb early exits).- No
forsugar, norepeat.
Returns¶
- Returns are top-level, agreement-style: one value whose location is
reported per role. Roles without the value get
NOOP; tuple returns are assembled into a plain tuple. - Returns inside branches are not executable (analyzed statically only) —
keep a single top-level
returnof a branch-assigned variable.
Type checker scope¶
klorpy.check catches branch/loop/return location inconsistency, which is
the genuinely dangerous class of error. It deliberately does not attempt a
full type system for the values themselves (KlorPy stays dynamically typed like
Python), nor does it implement Klor's strict knowledge-of-choice restriction —
KlorPy is intentionally more permissive: any role may participate in a branch
as long as a deciding role broadcasts the choice.
Transport¶
TcpTransport serializes with pickle, which is insecure against untrusted
data. Use it between trusted endpoints only. There is no authentication,
encryption, or backpressure handling in the prototype.
Not implemented (documented in the roadmap)¶
defchor forward declarations / mutual recursion, agree!, richer match,
and a mypy plugin (deliberately skipped — see
Status & roadmap).