Something went wrong. Try again.
Jam Programming Language jamlang.org
compiler
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798// `base[start..end]` range-slicing: builds a []T value {ptr+start,// end-start}. Bases can be many-item pointers, slices, or arrays.// Also covers `==`/`!=` on slices (length check + memcmp).
const { assert } = import("test");
extern fn strlen(s: *const[] u8) u64;
// Full span of a literal's bytes via its pointer.tfn sliceFull() { var lit: []u8 = "hello"; var s: []u8 = lit.ptr[0..5]; assert(s.len as u32, 5); assert(s[0], 104); // 'h' assert(s[4], 111); // 'o'}
// Sub-range with non-zero start.tfn sliceSubrange() { var lit: []u8 = "hello"; var s: []u8 = lit.ptr[1..4]; // "ell" assert(s.len as u32, 3); assert(s[0], 101); // 'e' assert(s[2], 108); // 'l'}
// End bound from a runtime expression (strlen).tfn sliceRuntimeEnd() { var lit: []u8 = "world!"; var n: u64 = strlen(lit.ptr); var s: []u8 = lit.ptr[0..n]; assert(s.len as u32, 6); assert(s[5], 33); // '!'}
// Empty slice (start == end).tfn sliceEmpty() { var lit: []u8 = "abc"; var s: []u8 = lit.ptr[2..2]; assert(s.len as u32, 0);}
// Slicing through a pointer binding (not just an inline member access).tfn sliceViaPointerVar() { var lit: []u8 = "abcdef"; var p: *const[] u8 = lit.ptr; var s: []u8 = p[2..5]; // "cde" assert(s.len as u32, 3); assert(s[0], 99); // 'c'}
// Slice base: reslicing a slice directly, no .ptr hop.tfn sliceOfSlice() { const s: str = "hello world"; const hello: []u8 = s[0..5]; const world: []u8 = s[6..11]; assert(hello.len as u32, 5); assert(world.len as u32, 5); assert(hello[0], 104); // 'h' assert(world[0], 119); // 'w'}
// Array base: slicing decays the array to its elements in place.tfn sliceOfArray() { var arr: [6]u16 = [1, 2, 3, 4, 5, 6]; const mid: []u16 = arr[2..5]; assert(mid.len as u32, 3); assert(mid[0] as u32, 3); assert(mid[2] as u32, 5);}
// `==` compares length first, then bytes.tfn sliceEquality() { const s: str = "hello world"; const hello: []u8 = s[0..5]; assert((hello == "hello") as u8, 1); assert((hello == "world") as u8, 0); assert((hello != "world") as u8, 1); assert((hello == "hell") as u8, 0); // length mismatch}
// Empty slices are equal to each other and nothing else.tfn sliceEqualityEmpty() { const s: str = "abc"; const e1: []u8 = s[1..1]; const e2: []u8 = s[2..2]; assert((e1 == e2) as u8, 1); assert((e1 == s) as u8, 0);}
// Wider element types compare by element size, not count.tfn sliceEqualityWide() { var a: [3]u32 = [7, 8, 9]; var b: [4]u32 = [0, 7, 8, 9]; assert((a[0..3] == b[1..4]) as u8, 1); assert((a[0..3] == b[0..3]) as u8, 0);}