OpenProse Folk Register
This is a skin layer. It requires
prose.mdto be loaded first. All execution semantics, state management, and VM behavior are defined there. This file only provides keyword translations.
An alternative register for OpenProse that leans into literary, theatrical, and folklore terminology. The functional register prioritizes utility and clarity; the folk register prioritizes whimsy and narrative flow.
How to Use
- Load
prose.mdfirst (execution semantics) - Load this file (keyword translations)
- When parsing
.prosefiles, accept folk keywords as aliases for functional keywords - All execution behavior remains identical—only surface syntax changes
Design constraint: Still aims to be "structured but self-evident" per the language tenets—just self-evident to a different sensibility.
Complete Translation Map
Core Constructs
| Functional | Folk | Origin | Connotation |
|---|---|---|---|
agent | sprite | Folklore | Quick, light, ephemeral spirit helper |
session | scene | Theatre | A moment of action, theatrical framing |
parallel | ensemble | Theatre | Everyone performs together |
block | act | Theatre | Reusable unit of dramatic action |
Composition & Binding
| Functional | Folk | Origin | Connotation |
|---|---|---|---|
use | summon | Folklore | Calling forth from elsewhere |
input | given | Fairy tale | "Given a magic sword..." |
output | yield | Agriculture/magic | What the spell produces |
let | name | Folklore | Naming has power (true names) |
const | seal | Medieval | Unchangeable, wax seal on decree |
context | bearing | Heraldry | What the messenger carries |
Control Flow
| Functional | Folk | Origin | Connotation |
|---|---|---|---|
repeat N | N times | Fairy tale | "Three times she called..." |
for...in | for each...among | Narrative | Slightly more storytelling |
loop | loop | — | Already poetic, unchanged |
until | until | — | Already works, unchanged |
while | while | — | Already works, unchanged |
choice | crossroads | Folklore | Fateful decisions at the crossroads |
option | path | Journey | Which path to take |
if | when | Narrative | "When the moon rises..." |
elif | or when | Narrative | Continued conditional |
else | otherwise | Storytelling | Natural narrative alternative |
Error Handling
| Functional | Folk | Origin | Connotation |
|---|---|---|---|
try | venture | Adventure | Attempting something uncertain |
catch | should it fail | Narrative | Conditional failure handling |
finally | ever after | Fairy tale | "And ever after..." |
throw | cry | Drama | Raising alarm, calling out |
retry | persist | Quest | Keep trying against odds |
Session Properties
| Functional | Folk | Origin | Connotation |
|---|---|---|---|
prompt | charge | Chivalry | Giving a quest or duty |
model | voice | Theatre | Which voice speaks |
Unchanged
These keywords already have poetic quality or are too functional to replace sensibly:
**...**discretion markers — already "breaking the fourth wall"loop,until,while— already work narrativelymap,filter,reduce,pmap— pipeline operators, functional is finemax— constraint modifieras— aliasing- Model names:
sonnet,opus,haiku— already poetic
Side-by-Side Comparison
Simple Program
# Functional
use "@alice/research" as research
input topic: "What to investigate"
agent helper:
model: sonnet
let findings = session: helper
prompt: "Research {topic}"
output summary = session "Summarize"
context: findings
# Folk
summon "@alice/research" as research
given topic: "What to investigate"
sprite helper:
voice: sonnet
name findings = scene: helper
charge: "Research {topic}"
yield summary = scene "Summarize"
bearing: findings
Parallel Execution
# Functional
parallel:
security = session "Check security"
perf = session "Check performance"
style = session "Check style"
session "Synthesize review"
context: { security, perf, style }
# Folk
ensemble:
security = scene "Check security"
perf = scene "Check performance"
style = scene "Check style"
scene "Synthesize review"
bearing: { security, perf, style }
Loop with Condition
# Functional
loop until **the code is bug-free** (max: 5):
session "Find and fix bugs"
# Folk
loop until **the code is bug-free** (max: 5):
scene "Find and fix bugs"
Error Handling
# Functional
try:
session "Risky operation"
catch as err:
session "Handle error"
context: err
finally:
session "Cleanup"
# Folk
venture:
scene "Risky operation"
should it fail as err:
scene "Handle error"
bearing: err
ever after:
scene "Cleanup"
Choice Block
# Functional
choice **the severity level**:
option "Critical":
session "Escalate immediately"
option "Minor":
session "Log for later"
# Folk
crossroads **the severity level**:
path "Critical":
scene "Escalate immediately"
path "Minor":
scene "Log for later"
Conditionals
# Functional
if **has security issues**:
session "Fix security"
elif **has performance issues**:
session "Optimize"
else:
session "Approve"
# Folk
when **has security issues**:
scene "Fix security"
or when **has performance issues**:
scene "Optimize"
otherwise:
scene "Approve"
Reusable Blocks
# Functional
block review(topic):
session "Research {topic}"
session "Analyze {topic}"
do review("quantum computing")
# Folk
act review(topic):
scene "Research {topic}"
scene "Analyze {topic}"
perform review("quantum computing")
The Case For Folk
- "OpenProse" is literary. Prose is a literary form—why not lean in?
- Fourth wall is theatrical.
**...**already uses theatre terminology. - Signals difference. Literary terms say "this is not your typical DSL."
- Internally consistent. Everything draws from folklore/theatre/narrative.
- Memorable.
sprite,scene,crossroadsstick in the mind. - Model names already fit.
sonnet,opus,haikuare poetic forms.
The Case Against Folk
- Cultural knowledge required. Not everyone knows folklore tropes.
- Harder to Google. "OpenProse summon" vs "OpenProse import."
- May feel precious. Some users want utilitarian tools.
- Translation overhead. Mental mapping to familiar concepts.
Alternatives Considered
For sprite (ephemeral agent)
| Keyword | Origin | Rejected because |
|---|---|---|
spark | English | Good but less folklore |
wisp | English | Too insubstantial |
herald | English | More messenger than worker |
courier | French | Good functional alternative, not literary |
envoy | French | Formal, diplomatic |
For shade (persistent agent, if implemented)
| Keyword | Origin | Rejected because |
|---|---|---|
daemon | Greek/Unix | Unix "always running" connotation |
oracle | Greek | Too "read-only" feeling |
spirit | Latin | Too close to sprite |
specter | Latin | Negative/spooky connotation |
genius | Roman | Overloaded (smart person) |
For ensemble (parallel)
| Keyword | Origin | Rejected because |
|---|---|---|
chorus | Greek | Everyone speaks same thing, not different |
troupe | French | Good alternative, slightly less clear |
company | Theatre | Overloaded (business) |
For crossroads (choice)
| Keyword | Origin | Rejected because |
|---|---|---|
fork | Path | Too technical (git fork) |
branch | Tree | Also too technical |
divergence | Latin | Too abstract |
Verdict
Preserved for benchmarking against the functional register. The functional register remains the primary path, but folk provides an interesting data point for:
- Learnability — Which is easier for newcomers?
- Memorability — Which sticks better?
- Error rates — Which leads to fewer mistakes?
- Preference — Which do users actually prefer?
A future experiment could present both registers and measure outcomes.