1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
import fn puts(str: [u8]) -> i32;
fn main() -> i32 {
return puts("Hello World!");
}
!use defaults->+
(add <- int <- int) -> int
add x -> y -> x + y
--------------------------
!use builtin -> universal -> Natural.
!use builtin -> universal -> Integer.
!use builtin -> universal -> Real.
!use builtin -> universal ->.
!use builtin -> x86 -> i32.
!use builtin -> x86_64 -> i128.
!use builtin -> x86 -> u32.
!use defaults -> +.
!use defaults -> println.
!use defaults -> map.
!entrypoint <- main.
(Vec3 <- a <- a <- Natural) -> (a, a, Natural).
Vec3 a b c -> (a, b, c).
(I <- ) ->.
I a -> a.
(K <- <-) ->.
K x -> y -> x.
(`add` <- Natural <- Natural) -> Natural.
`add` x -> y -> x + y.
(`+` <- Float <- Float) -> Float.
(doStuff <- Integer) -> Integer.
doStuff x -> 1.0 + x // Warning
(main <- [String]) -> ? IO.
main args -> match (x <- len args) (
(x = 0) -> println "No Args",
(x < 3) -> println (get 0 args),
-> map println args
).
(println <- String) -> ? IO.
println str -> (print str, print "\n").
!use defaults -> x86 -> linux -> _stdout.
!use defaults -> write.
(print <- String) -> ? IO.
print str -> write str _stdout.
(World) -> (IO, MemAction).
(IO) -> (FileRead, FileWrite, FileOpen, FileClose, FileStat).
(MemAction) -> (MemRead, MemWrite, MemMap, Alloc, Free).
(write <- String <- File a) -> (x86_64 -> i64) ? (FileAction a).
write str file -> !syscall_write (len str) str _stdout.
write str file -> !asm "syscall" (
!reg "rax" 1,
!reg "rsi" str,
!reg "rdx" file,
!reg "rdi" (len str))
("rax").
!use defaults -> dlopen.
(somefunc <- Integer) -> Integer.
somefunc -> !deref (dlopen "SomeFunc") 0.
!use builtin -> x86_64 -> ptr.
!use builtin -> x86_64 -> Pointer.
!setrule embedded. // Disables defaults, enables mutability underneath pointers
(Byte) -> Type.
(Color) -> Type.
Byte -> (x86_64 -> u8).
Color -> Byte.
(cols) -> Integer.
cols -> 80.
// (Byte, Byte) is packed
(framebuffer) -> (Pointer (Byte, Color)).
framebuffer -> ptr 0x8B000.
(buffset <- Natural <- Natural <- Byte <- Color) -> ? MemWrite.
buffset x y char col -> memwrite framebuffer (y * cols + x) (char, col).
|