Break the monolithic examples/50-smoke.sx into 30 focused per-section examples,
filed into their category blocks (basic/types/comptime/memory/protocols/ffi),
each carrying only the top-level decls its section references (the protocols
section keeps the full preamble — its deps flow through UFCS method calls that
name-based extraction can't see). Outputs verified identical to the original
section blocks.
Add examples/1036-errors-failable-smoke.sx — an end-to-end error-handling example
(the E5.4 work): named + inferred error sets consumed via destructure, try (in
helpers), catch (bare-expr / match-body / diverging / no-binding), or
value-terminator, onfail+defer interleave, and error.X value + {} tag
interpolation.
Remove examples/50-smoke.sx. Suite: 324 passed, 0 failed.
107 lines
2.4 KiB
Plaintext
107 lines
2.4 KiB
Plaintext
#import "modules/std.sx";
|
|
#import "modules/math/math.sx";
|
|
#import "modules/compiler.sx";
|
|
#import "modules/test.sx";
|
|
pkg :: #import "modules/testpkg";
|
|
|
|
add :: (a: s32, b: s32) -> s32 { a + b; }
|
|
|
|
mul :: (a: s32, b: s32) -> s32 { a * b; }
|
|
|
|
identity :: (x: $T) -> T { x; }
|
|
|
|
pair_add :: (a: $T, b: $U) -> s64 {
|
|
cast(s64) a + cast(s64) b;
|
|
}
|
|
|
|
typed_sum :: (..args: []s32) -> s32 {
|
|
result := 0;
|
|
for args: (it) { result = result + it; }
|
|
result;
|
|
}
|
|
|
|
apply :: (f: (s32, s32) -> s32, x: s32, y: s32) -> s32 {
|
|
f(x, y);
|
|
}
|
|
|
|
void_return :: () {
|
|
return;
|
|
}
|
|
|
|
implicit_return :: (x: s32) -> s32 {
|
|
x * 2;
|
|
}
|
|
|
|
early_return :: (x: s32) -> s32 {
|
|
if x > 10 { return 99; }
|
|
x;
|
|
}
|
|
|
|
main :: () {
|
|
|
|
// ========================================================
|
|
// 5. FUNCTIONS & DECLARATIONS
|
|
// ========================================================
|
|
print("=== 5. Functions ===\n");
|
|
|
|
// Constant binding
|
|
FORTY_TWO :: 42;
|
|
print("const: {}\n", FORTY_TWO);
|
|
|
|
// Typed constant
|
|
TYPED_PI : f64 : 3.14;
|
|
print("typed-const: {}\n", TYPED_PI);
|
|
|
|
// Variable with default init
|
|
di : s32;
|
|
print("default-init: {}\n", di);
|
|
|
|
// Implicit return
|
|
print("implicit-ret: {}\n", implicit_return(21));
|
|
|
|
// Explicit return
|
|
print("early-ret: {}\n", early_return(5));
|
|
print("early-ret2: {}\n", early_return(20));
|
|
|
|
// Void return
|
|
void_return();
|
|
print("void-return: ok\n");
|
|
|
|
// Generic — single param
|
|
print("generic-s32: {}\n", identity(42));
|
|
print("generic-f32: {}\n", identity(1.5));
|
|
print("generic-bool: {}\n", identity(true));
|
|
|
|
// Generic — multiple params
|
|
print("generic-multi: {}\n", pair_add(10, 20));
|
|
|
|
// Lambda
|
|
double :: (x: s32) => x * 2;
|
|
print("lambda: {}\n", double(7));
|
|
|
|
// Lambda with return type
|
|
halve :: (x: f32) -> f32 => x / 2.0;
|
|
print("lambda-ret: {}\n", halve(10.0));
|
|
|
|
// Local function (non-lambda)
|
|
local_add :: (a: s32, b: s32) -> s32 { a + b; }
|
|
print("local-fn: {}\n", local_add(3, 4));
|
|
|
|
// Nested function calls
|
|
print("fn-nested: {}\n", add(mul(2, 3), mul(4, 5)));
|
|
|
|
// Variadic (typed)
|
|
print("varargs: {}\n", typed_sum(1, 2, 3, 4, 5));
|
|
|
|
// Spread
|
|
spread_arr : [3]s32 = .[10, 20, 30];
|
|
print("spread: {}\n", typed_sum(..spread_arr));
|
|
|
|
// Function pointers
|
|
fp : (s32, s32) -> s32 = add;
|
|
print("fp: {}\n", fp(3, 4));
|
|
fp = mul;
|
|
print("fp-reassign: {}\n", fp(3, 4));
|
|
print("fp-apply: {}\n", apply(add, 10, 20));
|
|
}
|