λ

Agents for Igropyr

Two AI coding agents — one to build new services in Igropyr's actor model, one to port an existing Node/Express app.

Self-contained Markdown · API map labeled for Igropyr 1.3.0

Build on Igropyr

igropyr-dev — the development agent

Hand it a spec, a single endpoint, or the framework itself. igropyr-dev writes idiomatic Chez Scheme on Igropyr — direct blocking style, let-it-crash error handling, and a v1.3.0 API it reads from source before writing a line.

Direct blocking style

No async/await, no callbacks. mysql-query, http-get and receive park only the calling green process — Node's await chains flatten into ordinary sequential lines.

Reads the source, never guesses

Rule zero: it greps the .sc source headers before writing. A map of the app-facing modules stops it from hallucinating procedure names — it is a subset, not a census, so when the map is silent the source wins.

Records first, contracts at the edges

define-checked-record for structured data, define-checked at module boundaries — the type discipline that replaces TS interfaces, and that knows never to break a tail call.

Port from Node

node-to-igropyr — the porting agent

Hand it a Node.js route, a middleware, or a whole small Express app — get back the Igropyr port. Node's single-threaded event loop with Promises, async/await and defensive try/catch becomes Igropyr's actor model with spawn/send/receive, a supervised worker pool, and Let It Crash — Scheme a maintainer would have written, not JavaScript wearing parentheses.

async/await → straight-line

The scheduler yields for you. I/O calls already block only the calling process, so promise chains flatten into ordinary sequential code — no promise type invented.

try/catch → Let It Crash

Blanket 500-catchers are deleted: that is the worker supervisor's job. A guard stays only where there is a specific, meaningful recovery.

shared state → gen-server

A module-level Map shared across requests becomes a process (gen-server), because workers never share mutable state except through a process.

Node.js / ExpressIgropyr
async function / await pstraight-line synchronous Scheme; I/O parks the calling process only
try { } catch → 500delete it — the supervisor retries then answers 500 (Let It Crash)
app.get('/x', h)(app-get app "/x" (lambda (req res) ...))
(req, res, next)(lambda (req res next) ...) — call (next)
req.params.id(req-param req "id")
req.body (json)(req-json req); read with (json-ref j "name")
res.json(obj)(send-json! res alist) — string keys, and an array is a vector
res.status(c)(set-status! res c) then a send-*!
SSE / res.write(sse-start! res) + (sse-send! res msg) in a spawned process
ws.on('message')(app-ws app "/p" (lambda (ws req) ...)), loop on (ws-recv ws)
setInterval / worker(spawn (lambda () (let loop () ... (sleep-ms n) (loop))))
EventEmitter / pub-sub(igropyr pubsub): subscribe / publish
stateful singletona gen-server ((igropyr gen-server))
JSON.parse / stringify(string->json s) / (json->string v)