Exemplos da linguagem de programação Glide

Programas reais.
Formas reais.

Cada card abaixo é um programa completo e autocontido na linguagem de programação Glide por Murillo Deolino. Copie, salve como example.glide e execute com glide run example.glide.

Roteador HTTP

Rotas com correspondência de padrões, parâmetros de caminho, respostas JSON — tudo na stdlib.

import stdlib::http::*;
import stdlib::http::router::*;

fn user(req: *HttpRequest) -> HttpResponse {
    let id: string = req.param("id");
    return HttpResponse::ok()
        .json("{\"id\":\"".concat(id).concat("\"}"));
}

fn main() -> int {
    let r: *Router = Router::new();
    defer r.free();
    r.get("/users/:id", user);
    let res: !int = r.listen(8080);
    if !res.ok { println!("listen:", res.err); return 1; }
    return 0;
}

Pool de workers

Quatro workers, uma fila de tarefas, resultados transmitidos de volta por um canal de resultados.

fn worker(jobs: chan<int>, out: chan<int>) {
    while let n = jobs.recv() { out.send(n * n); }
}

fn main() -> int {
    let j: chan<int> = make_chan(8);
    let o: chan<int> = make_chan(8);
    for _ in 0..4 { spawn worker(j, o); }
    for n in [1, 2, 3, 4, 5] { j.send(n); }
    j.close();
    return 0;
}

JSON tipado

@derive(JsonBind) gera parse e emissão em tempo de compilação.

import stdlib::json::*;

@derive(JsonBind)
struct User {
    name: string,
    age:  int,
}

fn main() -> int {
    let u: User = User {
        name: "alice", age: 30,
    };
    println!(u.to_json());
    return 0;
}

Percurso de arquivos

Lista recursiva de arquivos .glide, conta linhas e exibe os totais.

import stdlib::fs::*;

fn main() -> int {
    let files: *Vector<string> =
        fs_list_rec("src", ".glide");
    let mut total: int = 0;
    for i in 0..files.len() {
        total = total + fs_lines_count(files.get(i));
    }
    println!("files:", files.len(), "lines:", total);
    return 0;
}

Cliente WebSocket

Handshake RFC 6455, match no tipo do frame, envio e recepção.

import stdlib::net::ws::*;

fn main() -> int {
    let r: !*WebSocket = WebSocket::connect("wss://echo.example/ws");
    if !r.ok { println!("connect:", r.err); return 1; }
    let ws: *WebSocket = r.val;
    defer ws.close(1000, "bye");

    let _s: !int = ws.send_text("hello");
    let m: !*WsMessage = ws.recv();
    if m.ok { println!("got:", m.val.text); }
    return 0;
}

Assembly inline · RDTSC

Lê o contador de timestamp sem passar por FFI. Restrições de operandos no estilo GCC.

fn read_tsc() -> u64 {
    let lo: u32 = 0;
    let hi: u32 = 0;
    asm volatile { "rdtsc" : "=a"(lo), "=d"(hi) }
    return ((hi as u64) << 32) | (lo as u64);
}

fn main() -> int {
    println!("tsc:", read_tsc());
    return 0;
}

A pasta examples/ do repositório tem dezenas de outros — servidores HTTP/2, streams gzip, clientes SMTP, extratores tar e um tour completo da linguagem.