Connor McCutcheon
6701bb1: Add README and update Makefile

Seq Demo

A simple HTTP server written in Seq, a concatenative stack-based programming language.

What is Seq?

Seq is a stack-based language with:

  • Static typing with row polymorphic stack effects
  • LLVM compilation to native binaries
  • CSP-style concurrency via green threads ("strands") and channels
  • Built-in TCP networking primitives

Quick Start

make run

Then visit http://localhost:5000

Endpoints

Route Description
GET / Home page (static HTML)
GET /health Health check
GET /api/status JSON status
GET /echo/:msg Echo message back

Commands

make build    # Build Docker image
make run      # Run in background
make run-fg   # Run in foreground
make stop     # Stop container
make logs     # View logs
make restart  # Rebuild and restart
make test     # Test endpoints
make clean    # Remove image

Project Structure

seq-demo/
├── main.seq          # Seq HTTP server source
├── static/
│   ├── index.html    # Home page
│   └── 404.html      # Not found page
├── Dockerfile        # Multi-stage build
└── Makefile          # Build commands

How It Works

The server uses Seq's native TCP primitives:

: main ( -- )
  8080 tcp-listen      # Listen on port
  accept-loop          # Accept connections
;

: accept-loop ( Int -- )
  dup tcp-accept       # Accept connection
  make-channel         # Create channel for worker
  dup [ worker ] spawn # Spawn green thread
  drop drop send       # Send connection to worker
  accept-loop          # Tail-recursive loop
;

Static files are loaded with file-slurp:

: serve-index ( -- String )
  "static/index.html" file-slurp http-html
;

Architecture

┌─────────────────────────────────────┐
│           Docker Container          │
│                                     │
│  ┌─────────┐       ┌─────────────┐  │
│  │  socat  │──────▶│  seq-demo   │  │
│  │  :5000  │       │    :8080    │  │
│  └─────────┘       └─────────────┘  │
│       ▲                             │
└───────│─────────────────────────────┘
        │
   External traffic

socat forwards external port 5000 to internal port 8080
(seq tcp-listen binds to localhost only)

Requirements

  • Docker

License

MIT

A demo of https://github.com/navicore/patch-seq

2
very cool!
Ed Sweeney
@navicore