Ejemplos
Cuatro programas cortos. Cada uno es un archivo completo — copia uno en
hello.lomt y ejecútalo. Lo que ves bajo cada uno es lo que realmente
imprimió.
El programa más pequeño
_start es donde arranca la máquina, y la salida pasa por la llamada al sistema
write: descriptor de archivo, puntero, longitud. La segunda llamada es
exit.
module hello fn _start() { let s: str = "hello from Loment\n"; syscall4(1, 1, str_ptr(s) as u64, str_len(s) as u64); syscall4(60, 0, 0, 0);}
hello from Loment
Una función con valor de retorno
Los tipos se escriben y nunca se infieren; no hay conversión numérica implícita, así que
un entero que necesita otro ancho lo dice con as.
module funct fn write_str(fd: u64, s: str) -> i64 { return syscall4(1, fd, str_ptr(s) as u64, str_len(s) as u64);} fn larger(a: u32, b: u32) -> u32 { if a > b { return a; } return b;} fn _start() { let m: u32 = larger(7, 9); if m == 9 { write_str(1, "larger(7, 9) came back with 9\n"); syscall4(60, 0, 0, 0); } write_str(1, "unexpected\n"); syscall4(60, 1, 0, 0);}
larger(7, 9) came back with 9
Una constante y un bucle
for recorre un rango y liga el índice. const es un valor de
tiempo de compilación, utilizable como cota.
module counting const LIMIT: u32 = 5; fn write_str(fd: u64, s: str) -> i64 { return syscall4(1, fd, str_ptr(s) as u64, str_len(s) as u64);} fn _start() { let sum: u32 = 0; for i in 0..LIMIT { sum = sum + i; } if sum == 10 { write_str(1, "the loop summed 0 through 4\n"); syscall4(60, 0, 0, 0); } write_str(1, "unexpected\n"); syscall4(60, 1, 0, 0);}
the loop summed 0 through 4
Un arreglo, pasado como slice
[u32; 3] es un arreglo con su longitud en el tipo; [u32] es un
slice, que no lleva longitud propia. &xs entrega el arreglo como slice,
y slice_len pregunta cuánto mide.
module slice fn write_str(fd: u64, s: str) -> i64 { return syscall4(1, fd, str_ptr(s) as u64, str_len(s) as u64);} fn sum(xs: [u32]) -> u32 { let acc: u32 = 0; let i: u32 = 0; while i < slice_len(xs) { acc = acc + xs[i]; i = i + 1; } return acc;} fn _start() { let xs: [u32; 3] = [1, 2, 3]; let s: u32 = sum(&xs); if s == 6 { write_str(1, "the slice summed to 6\n"); syscall4(60, 0, 0, 0); } write_str(1, "unexpected\n"); syscall4(60, 1, 0, 0);}
the slice summed to 6
Más
El repositorio lleva un conjunto mayor en loment/examples/. No todos enlazan en esta versión.
Todo lo de esta página se compiló y ejecutó con el paquete publicado
0.1.4. El sistema de capacidades — aquello de lo que la
página principal muestra un ejemplo — no está entre estos cuatro, porque no
enlaza en esta versión. Es un defecto conocido del enlazador autoalojado, no del
lenguaje: la implementación de referencia enlaza el mismo programa y lo ejecuta. Véanse
issue #102 y
#38 para la misma clase de
fallo.