Cookbook
Common patterns and recipes for Wyn.
Read a File Line by Line
wyn
var content = File.read("data.txt")
for line in content.lines() {
println(line)
}Parse JSON
wyn
var data = "{\"name\": \"Alice\", \"age\": 25}".parse_json()
println(data.get_string("name")) // Alice
println("${data.get_int("age")}") // 25HTTP Server with JSON API
wyn
var server = Http.listen(3000)
while true {
var req = Http.accept(server)
var path = req.split("|")[1]
if path == "/api/hello" {
Http.respond(req, 200, Json.stringify({"message": "hello"}))
} else {
Http.respond(req, 404, "{\"error\": \"not found\"}")
}
}Concurrent Map
wyn
fn process(item: string) -> string {
return item.upper()
}
var items = ["hello", "world", "wyn"]
var futures = []
for item in items {
futures.push(spawn process(item))
}
var results = []
for f in futures {
results.push(await f)
}
// results: ["HELLO", "WORLD", "WYN"]CSV Processing
wyn
var csv = Csv.parse(File.read("data.csv"))
for i in 1..Csv.row_count(csv) {
var name = Csv.get_field(csv, i, "name")
var age = Csv.get_field(csv, i, "age")
println(name + " is " + age + " years old")
}String Manipulation
wyn
var s = " Hello, World! "
println(s.trim()) // "Hello, World!"
println(s.trim().upper()) // "HELLO, WORLD!"
println(s.trim().replace("World", "Wyn")) // "Hello, Wyn!"
println(s.trim().split(", ").join(" | ")) // "Hello | World!"HashMap
wyn
var m = HashMap.new()
HashMap.set(m, "name", "Alice")
HashMap.set(m, "city", "NYC")
println(HashMap.get(m, "name")) // Alice
println("${HashMap.len(m)}") // 2Logging
wyn
Log.set_level(1) // INFO and above
Log.info("starting")
Log.debug("hidden") // suppressed
Log.warn("careful")
Log.error("failed")Base64
wyn
var encoded = Base64.encode("secret data")
println(encoded) // c2VjcmV0IGRhdGE=
println(Base64.decode(encoded)) // secret dataCommand-Line Arguments
wyn
var name = Args.get("name")
var verbose = Args.has("v")
if name != "" {
println("Hello, " + name)
}Benchmarking
wyn
fn fib(n: int) -> int {
if n <= 1 { return n }
return fib(n - 1) + fib(n - 2)
}
// Run with: wyn bench fib.wyn --iterations 10
fib(35)HTTP Client
Make GET and POST requests with headers:
wyn
// Simple GET
var body = Http.get("https://api.example.com/users")
println(body)
// POST with JSON body
var resp = Http.post("https://api.example.com/users",
Json.stringify({"name": "Alice", "role": "admin"}),
["Content-Type: application/json"])
println(resp)JSON Parsing and Building
Parse nested JSON, build new objects, and handle missing keys:
wyn
var raw = File.read("config.json")
var cfg = Json.parse(raw)
var host = Json.get(cfg, "server.host")
var port = Json.get_int(cfg, "server.port")
var tags = Json.get_array(cfg, "tags")
// Build a new JSON object
var out = Json.object()
Json.set(out, "status", "ok")
Json.set(out, "count", tags.len())
println(Json.stringify(out))CSV Processing with Filtering
Read a CSV, filter rows, and write results:
wyn
var csv = Csv.parse(File.read("sales.csv"))
var total = 0.0
for i in 1..Csv.row_count(csv) {
var region = Csv.get_field(csv, i, "region")
var amount = Csv.get_field(csv, i, "amount").to_float()
if region == "US" {
total = total + amount
}
}
println("US total: $${total}")
File.write("report.txt", "US sales total: $${total}\n")File Watcher
Poll a directory for changes and react:
wyn
var last_mod = 0
while true {
var mod = File.modified("config.json")
if mod > last_mod {
println("Config changed, reloading...")
var cfg = Json.parse(File.read("config.json"))
last_mod = mod
}
Time.sleep(1000)
}CLI Argument Parsing
Build a CLI tool with named flags and positional args:
wyn
var cmd = Args.get_positional(0)
var output = Args.get("output", "result.txt")
var verbose = Args.has("verbose")
if cmd == "" {
println("Usage: mytool <command> [--output file] [--verbose]")
return 1
}
if verbose {
Log.set_level(0) // DEBUG
}
Log.debug("Running command: ${cmd}")
Log.info("Output: ${output}")Run it: wyn run tool.wyn -- process --output data.csv --verbose
SQLite CRUD
Full create/read/update/delete with a SQLite database:
wyn
var db = Db.open("app.db")
Db.exec(db, "CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY, name TEXT, email TEXT)")
// Create
Db.exec(db, "INSERT INTO users(name, email) VALUES(?, ?)", ["Alice", "[email protected]"])
// Read
var rows = Db.query(db, "SELECT id, name, email FROM users")
for row in rows {
println("${row[0]}: ${row[1]} <${row[2]}>")
}
// Update
Db.exec(db, "UPDATE users SET email = ? WHERE name = ?", ["[email protected]", "Alice"])
// Delete
Db.exec(db, "DELETE FROM users WHERE name = ?", ["Alice"])
Db.close(db)Regex Extraction
Extract patterns from text using regex:
wyn
var text = "Contact us at [email protected] or [email protected]"
var emails = Regex.find_all(text, "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}")
for email in emails {
println("Found: ${email}")
}
// Named groups
var log = "2026-04-23 ERROR: disk full"
var m = Regex.match(log, "(\\d{4}-\\d{2}-\\d{2}) (\\w+): (.+)")
if m.matched {
println("Date: ${m.group(1)}") // 2026-04-23
println("Level: ${m.group(2)}") // ERROR
println("Msg: ${m.group(3)}") // disk full
}Environment Variables
Read config from the environment with defaults:
wyn
var port = Env.get("PORT", "8080").to_int()
var db_url = Env.get("DATABASE_URL", "app.db")
var debug = Env.get("DEBUG", "false") == "true"
if debug {
Log.set_level(0)
Log.debug("Debug mode on")
}
println("Starting on port ${port}")
println("Database: ${db_url}")See Also
- Quick Start — get your first Wyn project running
- Standard Library — full API docs for all modules
- Build a Web Server — step-by-step web server tutorial
- FAQ — common questions answered