soma.cell

A flesh body does only what its signal's frame says

Pitfall 27 of writing Soma, the programming language: a habit from another language, or a rule that surprises, with what the Soma compiler answers and the form to write.

skeleton Orders {
    memory { log: Map<String, String> }
    face { signal place(id: String) -> String }
}
flesh Orders {
    on place(id) { log.set(id, "x")  return id }
}
// error: `Orders.place` writes `log`, outside its frame (no `writes`) — if the design
//        means it, add it to `signal place` in `skeleton Orders`: `writes log`
skeleton Orders {
    memory { log: Map<String, String> }
    face { signal place(id: String) -> String  writes log }
}
flesh Orders {
    on place(id) { log.set(id, "x")  return id }
}

A frame is closed: reads / writes slots, moves machine edges, calls other signals and effectful builtins (now, random, think, …), emits. A signal with no clause is pure. soma skeleton app.cell Orders.place prints what one signal may touch.