hare

[hare] The Hare programming language
git clone https://git.torresjrjr.com/hare.git
Log | Files | Refs | README | LICENSE

expr.ha (5608B)


      1 // License: MPL-2.0
      2 // (c) 2021 Alexey Yerin <yyp@disroot.org>
      3 // (c) 2021 Bor Grošelj Simić <bor.groseljsimic@telemach.net>
      4 // (c) 2021 Drew DeVault <sir@cmpwn.com>
      5 // (c) 2021 Ember Sawady <ecs@d2evs.net>
      6 // (c) 2022 Sebastian <sebastian@sebsite.pw>
      7 
      8 @test fn assignment() void = {
      9 	roundtrip("export fn main() void = {
     10 	x = y;
     11 	*x = *y + 10;
     12 	*x = *foo();
     13 	*y() = bar();
     14 	x += 10;
     15 	x -= 10;
     16 	x *= 10;
     17 	x /= 10;
     18 	x %= 10;
     19 	x &= 10;
     20 	x |= 10;
     21 	x ^= 10;
     22 	x >>= 10;
     23 	x <<= 10;
     24 	x &&= true;
     25 	x ||= true;
     26 	x ^^= true;
     27 };
     28 ");
     29 };
     30 
     31 @test fn binarithm() void = {
     32 	roundtrip("export fn main() void = *void + void * void / void;\n");
     33 };
     34 
     35 @test fn binding() void = {
     36 	roundtrip("export fn main() void = {
     37 	let x: int = 1337, y = 7331;
     38 	const z: int = 42, q: int = 24;
     39 	const (foo, bar): (int, bool) = (42, true);
     40 	const (foo, _, bar): (int, uint, bool) = (42, 12u, true);
     41 	static let p: int = 62893, o = 39826;
     42 	static const w: int = 62893, t = 39826;
     43 };
     44 ");
     45 };
     46 
     47 @test fn builtin() void = {
     48 	roundtrip(`export fn main() void = {
     49 	alloc(1234);
     50 	alloc(1234...);
     51 	alloc(4321, 1234);
     52 	append(x, 10);
     53 	append(x, 10...);
     54 	append(x, 10, 20, 30);
     55 	append(x, y, z, q...);
     56 	static append(x, 10);
     57 	abort();
     58 	abort("surprize");
     59 	static abort();
     60 	static abort("surprize");
     61 	assert(x == 12);
     62 	assert(x == 12, "number mismatch");
     63 	static assert(x == 12);
     64 	static assert(x == 12, "number mismatch");
     65 	delete(x[10]);
     66 	delete(x[10..20]);
     67 	delete(x[..]);
     68 	delete(x.y.z[..]);
     69 	static delete(x[10]);
     70 	free(x);
     71 	insert(x[0], foo);
     72 	insert(x[0], foo...);
     73 	insert(x[0], foo, bar...);
     74 	static insert(x[0], foo);
     75 	len([1, 2, 3, 4]);
     76 	offset(foo.bar);
     77 	size(u32);
     78 	vastart();
     79 	vaarg(va);
     80 	vaend(va);
     81 };
     82 `);
     83 };
     84 
     85 @test fn call() void = {
     86 	roundtrip("export fn main() void = test();\n\n"
     87 		"export fn main() void = test(void, void, void);\n\n"
     88 		"export fn main() void = test(void, void, void...);\n\n"
     89 		"export fn main() void = test()()(void);\n");
     90 };
     91 
     92 @test fn cast() void = {
     93 	roundtrip("export fn main() void = void: int;\n\n"
     94 		"export fn main() void = void as int;\n\n"
     95 		"export fn main() void = void is int;\n\n"
     96 		"export fn main() void = void as null;\n\n"
     97 		"export fn main() void = void is null;\n\n"
     98 		"export fn main() void = void: int: uint: u16: u8;\n\n"
     99 		"export fn main() void = void: int as uint: u16 is u8;\n\n"
    100 		"export fn main() void = void: int as null: u16 is null;\n\n"
    101 		"export fn main() void = {\n\tyield void;\n}: int;\n");
    102 };
    103 
    104 @test fn constant() void = {
    105 	roundtrip(`export fn main() void = {
    106 	2 + (-4 + void) * true / ("hello" << '?');
    107 	[1, 2, 3, 4];
    108 	[1, 2, 3, 4...];
    109 	(1, 2, 3);
    110 	struct {
    111 		x: int = 10,
    112 		y: int = 20,
    113 	};
    114 	coords {
    115 		x: int = 10,
    116 		y: int = 20,
    117 		...
    118 	};
    119 	coords {
    120 		x = 10,
    121 		y = 20,
    122 	};
    123 	struct {
    124 		x: int = 10,
    125 		struct {
    126 			y: int = 20,
    127 		},
    128 	};
    129 	struct {
    130 		x: int = 10,
    131 		coords {
    132 			y: int = 20,
    133 		},
    134 	};
    135 	struct {
    136 		x: int = 10,
    137 		namespace::coords {
    138 			y: int = 20,
    139 		},
    140 	};
    141 	coords {
    142 		...
    143 	};
    144 	13.37;
    145 	13.37f32;
    146 	13.37f64;
    147 	6.022e23;
    148 	1.616255e-35;
    149 	1337z;
    150 	1337u;
    151 	1337i8;
    152 	1337u8;
    153 	1337i16;
    154 	1337u16;
    155 	1337i32;
    156 	1337u32;
    157 	1337i64;
    158 	1337u64;
    159 	"backslashes\\and \"double quotes\"";
    160 	'\'';
    161 	'\\';
    162 };
    163 `);
    164 };
    165 
    166 @test fn control() void = {
    167 	roundtrip("export fn main() void = {
    168 	break;
    169 	break :foo;
    170 	continue;
    171 	continue :foo;
    172 	return;
    173 	return 2 + 2;
    174 };
    175 ");
    176 };
    177 
    178 @test fn defer_expr() void = {
    179 	roundtrip("export fn main() void = defer foo();\n");
    180 };
    181 
    182 @test fn for_expr() void = {
    183 	roundtrip("export fn main() void = {
    184 	for (true) {
    185 		x;
    186 	};
    187 	for (true) :label {
    188 		x;
    189 	};
    190 	for (let x = 0; x < 10) {
    191 		x;
    192 	};
    193 	for (x < 10; x) {
    194 		x;
    195 	};
    196 	for (let x = 10; x < 10; x) {
    197 		x;
    198 	};
    199 	for (static let x = 0; x < 10) {
    200 		x;
    201 	};
    202 };
    203 ");
    204 };
    205 
    206 @test fn if_expr() void = {
    207 	roundtrip("export fn main() void = {
    208 	if (x == y) {
    209 		z;
    210 	};
    211 	if (y == x) z;
    212 	if (z == q) r else p;
    213 	if (a == b) c else if (d == e) f else g;
    214 };
    215 ");
    216 };
    217 
    218 @test fn list() void = {
    219 	roundtrip("export fn main() void = {
    220 	2 + 2;
    221 	call();
    222 };
    223 ");
    224 };
    225 
    226 @test fn postfix() void = {
    227 	roundtrip("export fn main() void = x.y;\n\n"
    228 		"export fn main() void = x.y.z.q;\n\n"
    229 		"export fn main() void = x().y;\n\n"
    230 		"export fn main() void = x.42;\n\n"
    231 		"export fn main() void = x().y.0.q;\n\n"
    232 		"export fn main() void = x?;\n\n"
    233 		"export fn main() void = x!;\n\n"
    234 		"export fn main() void = x()?.y;\n\n"
    235 		"export fn main() void = x[10];\n\n"
    236 		"export fn main() void = x[10 + 10][20];\n");
    237 };
    238 
    239 @test fn slice() void = {
    240 	roundtrip("export fn main() void = x[..];\n\n"
    241 		"export fn main() void = x[123..];\n\n"
    242 		"export fn main() void = x[123..321];\n\n"
    243 		"export fn main() void = x[..321];\n");
    244 };
    245 
    246 @test fn switch_expr() void = {
    247 	roundtrip("export fn main() void = {
    248 	switch (x) {
    249 	case 1234, 4321 =>
    250 		return y;
    251 	case 1337 =>
    252 		return z;
    253 	case =>
    254 		return q;
    255 	};
    256 };
    257 ");
    258 };
    259 
    260 @test fn match_expr() void = {
    261 	roundtrip("export fn main() void = {
    262 	match (x) {
    263 	case let i: size =>
    264 		return y;
    265 	case foo =>
    266 		return bar;
    267 	case let foo: int =>
    268 		return bar;
    269 	case foo::bar =>
    270 		return baz;
    271 	case null => void;
    272 	case *int => void;
    273 	};
    274 	match (x) {
    275 	case let s: matchdata =>
    276 		return y;
    277 	case str =>
    278 		return z;
    279 	case =>
    280 		return q;
    281 	};
    282 };
    283 ");
    284 };
    285 
    286 @test fn unarithm() void = {
    287 	roundtrip("export fn main() void = +void;\n\n"
    288 		"export fn main() void = -void;\n\n"
    289 		"export fn main() void = *void;\n\n"
    290 		"export fn main() void = ~void;\n\n"
    291 		"export fn main() void = !void;\n\n"
    292 		"export fn main() void = &void;\n");
    293 };
    294 
    295 @test fn yield_expr() void = {
    296 	roundtrip("export fn main() void = yield;\n\n"
    297 		"export fn main() void = yield void;\n\n"
    298 		"export fn main() void = yield :foo;\n\n"
    299 		"export fn main() void = yield :foo, void;\n");
    300 };