HigherOrderCO / HigherOrderCO/HVM4

Initial set of primitives

Open
#31 1 comment 0 reactions 1 assignee Claimed by @pjcavalcanti View on GitHub
Dominant language
C
Stars
121
Forks
28
PR merge metrics
No merged PRs in 30d

Description

## Initial set of primitives

Implement the primitives described in the list below. See *Notes* to coordinate with other tasks.

### Note on JIT (#27)
- If common functions are kept as `defs` (e.g. `map` / `fold` / `length` / `concat` / `split`),
a JIT could accelerate them without turning them into primitives.

### Note on FFI (#28)
- `read_file` / `write_file` might be implemented via FFI with C,
instead of dedicated primitives.

---

## Proposed primitives

### Debug / observability (can inspect without consuming the term)
- **Rationale:** inspect terms in lazy mode without altering evaluation.
- `%show(x: a) -> String`
- Stringifies without reducing and without consuming the term.
- Use the current printing format (normalize mode / no collapse).
- `%trace(msgs: List, x: a) -> a`
- Prints the concatenation of `msgs` and returns `x` without consuming it.
- Use the current printing format (normalize mode / no collapse).

### Control / error
- **Rationale:** explicit failures and error messages.
- `%panic(msg: String) -> a`
- Aborts with a message; only triggers if evaluated.

### IO
- **Rationale:** basic input/output effects with explicit errors.
- `%log(s: String) -> #Nil` (existing)
- `String` = list of `#Chr`.
- Kept as-is (returns `[]`).
- `%read_file(path: String) -> #Ok{String} | #Err{String}`
- IO with explicit error; no silent failure.
- `%write_file(path: String, data: String) -> #Ok{} | #Err{String}`
- IO with explicit error.
- `%read_bytes(path: String) -> #Ok{List<#U8{NUM}>} | #Err{String}`
- Byte = `#U8{n}` with `n` stored in 8 bits.
- `%write_bytes(path: String, data: List<#U8{NUM}>) -> #Ok{} | #Err{String}`
- Byte = `#U8{n}` with `n` stored in 8 bits.

### Effects / nondeterminism
- **Rationale:** time and RNG utilities while keeping clear semantics.
- `%time_ms() -> NUM`
- Monotonic; effectful; result depends on when it is demanded.
- `%rand(seed: NUM, bits: NUM) -> #Pair{seed2, value}`
- Pure/deterministic PRNG; `bits` defines width.
- Supported term bit sizes:
- 7 (TAG), 24 (EXT), 32 (VAL).
- Supported common sizes: 8 / 16 / 64.
- `bits` outside this set: `panic`.

### Common FP utilities
- **Rationale:** basic library building blocks; decide whether they remain defs or become primitives.
- Lists: `map`, `fold`, `length`, `concat`, `split`
- Strings: `num_to_str`, `str_to_num`

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.