summaryrefslogtreecommitdiff
path: root/examples/example.gn
blob: 35e2ce0bddd25310505bb76128ef7bb0b95bc3fd (plain)
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).