Skip to content

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/pack operands must be choreographic variables;
  • if/match subjects must be variables (write big = x >= 10 first);
  • return values 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

  • while requires 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/continue work in lockstep loops only; both are rejected inside broadcast loops (the token protocol cannot absorb early exits).
  • No for sugar, no repeat.

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 return of 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).