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.