---
role: experimental
summary: |
  Arabian Nights register for OpenProse—a narrative/nested alternative keyword set.
  Djinns, tales within tales, wishes, and oaths. For benchmarking against the functional register.
status: draft
requires: prose.md
---

# OpenProse Arabian Nights Register

> **This is a skin layer.** It requires `prose.md` to 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 draws from One Thousand and One Nights. Programs become tales told by Scheherazade. Recursion becomes stories within stories. Agents become djinns bound to serve.

## How to Use

1. Load `prose.md` first (execution semantics)
2. Load this file (keyword translations)
3. When parsing `.prose` files, accept Arabian Nights keywords as aliases for functional keywords
4. 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 through a storytelling lens.

---

## Complete Translation Map

### Core Constructs

| Functional | Nights | Reference |
|------------|--------|-----------|
| `agent` | `djinn` | Spirit bound to serve, grants wishes |
| `session` | `tale` | A story told, a narrative unit |
| `parallel` | `bazaar` | Many voices, many stalls, all at once |
| `block` | `frame` | A story that contains other stories |

### Composition & Binding

| Functional | Nights | Reference |
|------------|--------|-----------|
| `use` | `conjure` | Summoning from elsewhere |
| `input` | `wish` | What is asked of the djinn |
| `output` | `gift` | What is granted in return |
| `let` | `name` | Naming has power (same as folk) |
| `const` | `oath` | Unbreakable vow, sealed |
| `context` | `scroll` | What is written and passed along |

### Control Flow

| Functional | Nights | Reference |
|------------|--------|-----------|
| `repeat N` | `N nights` | "For a thousand and one nights..." |
| `for...in` | `for each...among` | Among the merchants, among the tales |
| `loop` | `telling` | The telling continues |
| `until` | `until` | Unchanged |
| `while` | `while` | Unchanged |
| `choice` | `crossroads` | Where the story forks |
| `option` | `path` | One way the story could go |
| `if` | `should` | Narrative conditional |
| `elif` | `or should` | Continued conditional |
| `else` | `otherwise` | The other telling |

### Error Handling

| Functional | Nights | Reference |
|------------|--------|-----------|
| `try` | `venture` | Setting out on the journey |
| `catch` | `should misfortune strike` | The tale turns dark |
| `finally` | `and so it was` | The inevitable ending |
| `throw` | `curse` | Ill fate pronounced |
| `retry` | `persist` | The hero tries again |

### Session Properties

| Functional | Nights | Reference |
|------------|--------|-----------|
| `prompt` | `command` | What is commanded of the djinn |
| `model` | `spirit` | Which spirit answers |

### Unchanged

These keywords already work or are too functional to replace sensibly:

- `**...**` discretion markers — already work
- `until`, `while` — already work
- `map`, `filter`, `reduce`, `pmap` — pipeline operators
- `max` — constraint modifier
- `as` — aliasing
- Model names: `sonnet`, `opus`, `haiku` — already poetic

---

## Side-by-Side Comparison

### Simple Program

```prose
# 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
```

```prose
# Nights
conjure "@alice/research" as research
wish topic: "What to investigate"

djinn helper:
  spirit: sonnet

name findings = tale: helper
  command: "Research {topic}"

gift summary = tale "Summarize"
  scroll: findings
```

### Parallel Execution

```prose
# Functional
parallel:
  security = session "Check security"
  perf = session "Check performance"
  style = session "Check style"

session "Synthesize review"
  context: { security, perf, style }
```

```prose
# Nights
bazaar:
  security = tale "Check security"
  perf = tale "Check performance"
  style = tale "Check style"

tale "Synthesize review"
  scroll: { security, perf, style }
```

### Loop with Condition

```prose
# Functional
loop until **the code is bug-free** (max: 5):
  session "Find and fix bugs"
```

```prose
# Nights
telling until **the code is bug-free** (max: 5):
  tale "Find and fix bugs"
```

### Error Handling

```prose
# Functional
try:
  session "Risky operation"
catch as err:
  session "Handle error"
    context: err
finally:
  session "Cleanup"
```

```prose
# Nights
venture:
  tale "Risky operation"
should misfortune strike as err:
  tale "Handle error"
    scroll: err
and so it was:
  tale "Cleanup"
```

### Choice Block

```prose
# Functional
choice **the severity level**:
  option "Critical":
    session "Escalate immediately"
  option "Minor":
    session "Log for later"
```

```prose
# Nights
crossroads **the severity level**:
  path "Critical":
    tale "Escalate immediately"
  path "Minor":
    tale "Log for later"
```

### Conditionals

```prose
# Functional
if **has security issues**:
  session "Fix security"
elif **has performance issues**:
  session "Optimize"
else:
  session "Approve"
```

```prose
# Nights
should **has security issues**:
  tale "Fix security"
or should **has performance issues**:
  tale "Optimize"
otherwise:
  tale "Approve"
```

### Reusable Blocks (Frame Stories)

```prose
# Functional
block review(topic):
  session "Research {topic}"
  session "Analyze {topic}"

do review("quantum computing")
```

```prose
# Nights
frame review(topic):
  tale "Research {topic}"
  tale "Analyze {topic}"

tell review("quantum computing")
```

### Fixed Iteration

```prose
# Functional
repeat 1001:
  session "Tell a story"
```

```prose
# Nights
1001 nights:
  tale "Tell a story"
```

### Immutable Binding

```prose
# Functional
const config = { model: "opus", retries: 3 }
```

```prose
# Nights
oath config = { spirit: "opus", persist: 3 }
```

---

## The Case For Arabian Nights

1. **Frame narrative is recursion.** Stories within stories maps perfectly to nested program calls.
2. **Djinn/wish/gift.** The agent/input/output mapping is extremely clean.
3. **Rich tradition.** One Thousand and One Nights is globally known.
4. **Bazaar for parallel.** Many merchants, many stalls, all active at once—vivid metaphor.
5. **Oath for const.** An unbreakable vow is a perfect metaphor for immutability.
6. **"1001 nights"** as a loop count is delightful.

## The Case Against Arabian Nights

1. **Cultural sensitivity.** Must be handled respectfully, avoiding Orientalist tropes.
2. **"Djinn" pronunciation.** Users unfamiliar may be uncertain (jinn? djinn? genie?).
3. **Some mappings feel forced.** "Bazaar" for parallel is vivid but not obvious.
4. **"Should misfortune strike"** is long for `catch`.

---

## Key Arabian Nights Concepts

| Term | Meaning | Used for |
|------|---------|----------|
| Scheherazade | The narrator who tells tales to survive | (the program author) |
| Djinn | Supernatural spirit, bound to serve | `agent` → `djinn` |
| Frame story | A story that contains other stories | `block` → `frame` |
| Wish | What is asked of the djinn | `input` → `wish` |
| Oath | Unbreakable promise | `const` → `oath` |
| Bazaar | Marketplace, many vendors | `parallel` → `bazaar` |

---

## Alternatives Considered

### For `djinn` (agent)

| Keyword | Rejected because |
|---------|------------------|
| `genie` | Disney connotation, less literary |
| `spirit` | Used for `model` |
| `ifrit` | Too specific (a type of djinn) |
| `narrator` | Too meta, Scheherazade is the user |

### For `tale` (session)

| Keyword | Rejected because |
|---------|------------------|
| `story` | Good but `tale` feels more literary |
| `night` | Reserved for `repeat N nights` |
| `chapter` | More Western/novelistic |

### For `bazaar` (parallel)

| Keyword | Rejected because |
|---------|------------------|
| `caravan` | Sequential connotation (one after another) |
| `chorus` | Greek, wrong tradition |
| `souk` | Less widely known |

### For `scroll` (context)

| Keyword | Rejected because |
|---------|------------------|
| `letter` | Too small/personal |
| `tome` | Too large |
| `message` | Too plain |

---

## Verdict

Preserved for benchmarking. The Arabian Nights register offers a storytelling frame that maps naturally to recursive, nested programs. The djinn/wish/gift trio is particularly elegant.

Best suited for:

- Programs with deep nesting (stories within stories)
- Workflows that feel like granting wishes
- Users who enjoy narrative framing

The `frame` keyword for reusable blocks is especially apt—Scheherazade's frame story containing a thousand tales.
