aboutsummaryrefslogtreecommitdiff
path: root/code/demo.odin
blob: b95ae52afdc2c2e46401e782778d5326cdd51a5d (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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#import "fmt.odin";

main :: proc() {
/*
	Version 0.1.0

	Added:
	 * Dynamic Arrays `[...]Type`
	 * Dynamic Maps   `map[Key]Value`
	 * Dynamic array and map literals
	 * Custom struct alignemnt `struct #align 8 { bar: i8 }`
	 * Allow `_` in numbers
	 * Variadic `append`
	 * fmt.sprint*
	 * Entities prefixes with an underscore do not get exported on imports
	 * Overloaded `free` for pointers, slices, strings, dynamic arrays, and dynamic maps
	 * enum types have an implict `names` field, a []string of all the names in that enum

	Removed:
	 * Maybe/option types
	 * immutable variables
	 * Remove `type` keyword and other "reserved" keywords
	 * `compile_assert` and `assert`return the value of the condition for semantic reasons

	Changed:
	 * thread_local -> #thread_local
	 * #include -> #load
	 * Files only get checked if they are actually used
	 * match x in y {} // For type match statements
	 * Version numbering now starts from 0.1.0 and uses the convention:
	 	- major.minor.patch

	Fixes:
	 * Many fmt.* fixes

	To come very Soon™:
	 * Linux and OS X builds (unofficial ones do exist already)
*/

	{
		Fruit :: enum {
			APPLE,
			BANANA,
			COCONUT,
		}
		fmt.println(Fruit.names);
	}

	{
		m: map[f32]int;
		reserve(m, 16);
		defer free(m);

		m[1.0] = 1278;
		m[2.0] = 7643;
		m[3.0] = 564;
		_, ok := m[3.0];
		c := m[3.0];
		assert(ok && c == 564);

		fmt.print("map[");
		i := 0;
		for val, key in m {
			if i > 0 {
				fmt.print(", ");
			}
			fmt.printf("%v=%v", key, val);
			i += 1;
		}
		fmt.println("]");
	}
	{
		m := map[string]u32{
			"a" = 56,
			"b" = 13453,
			"c" = 7654,
		};
		defer free(m);

		c := m["c"];
		_, ok := m["c"];
		assert(ok && c == 7654);

		fmt.println(m);
	}

	{
		x: [...]f64;
		reserve(x, 16);
		defer free(x);
		append(x, 2_000_000.500_000, 3, 5, 7);

		for p, i in x {
			if i > 0 { fmt.print(", "); }
			fmt.print(p);
		}
		fmt.println();
	}

	{
		x := [...]f64{2_000_000.500_000, 3, 5, 7};
		defer free(x);
		fmt.println(x);
	}


	{
		Vec3 :: [vector 3]f32;

		x := Vec3{1, 2, 3};
		y := Vec3{4, 5, 6};
		fmt.println(x < y);
		fmt.println(x + y);
		fmt.println(x - y);
		fmt.println(x * y);
		fmt.println(x / y);

		for i in x {
			fmt.println(i);
		}

		compile_assert(size_of([vector 7]bool) == size_of([7]bool));
		compile_assert(size_of([vector 7]i32) == size_of([7]i32));
		// align_of([vector 7]i32) != align_of([7]i32) // this may be the case
	}
}