smol lang
Diffstat (limited to 'draft.kl')
| -rw-r--r-- | draft.kl | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/draft.kl b/draft.kl new file mode 100644 index 0000000..2f3b5c7 --- /dev/null +++ b/draft.kl @@ -0,0 +1,109 @@ +sint: typeset = { i8, i16, i32, i64 } +uint: typeset = { u8, u16, u32, u64 } +int: typeset = sint ∪ uint; +float: typeset = { f32, f64 }; +numeric: typeset = integer ∪ float; + +mod intrinsics { + eq ((a: T, b: T) -> bool) { compiler_defined } [prefix, infix] + and ((a: T, b: T) -> T) { compiler_defined } [prefix, infix, T ∈ int] + or ((a: T, b: T) -> T) { compiler_defined } [prefix, infix, T ∈ int] + // .. +} + +enum bool { true, false } + +each (x: set[T] -> for[T]) { idk } [prefix] +each (x: typeset[T] -> for[T]) { idk } [prefix] +each (x: slice[T] -> for[T]) { idk } [prefix] +each (x: vec[T] -> for[T]) { idk } [prefix] +each (x: array[T, N] -> for[T]) { idk } [prefix, N ∈ ℤ] + +¬ (x: T -> bool) [alias { !, not }, prefix { tighter_than all }] +- (x: T -> T) [alias neg, prefix { like ¬ }] + +× ((a: T, b: T) -> T) [alias { *, ⋅, mul }, infix { associativity <, looser_than ¬ }] +÷ ((a: T, b: T) -> T) [alias { /, div }, infix { like × }] +rem ((a: T, b: T) -> T) [infix { like × }] +mod ((a: T, b: T) -> T) [infix { like × }] +∣ ((a: T, b: T) -> T) { a mod b == 0 } [infix { like × }] +∤ ((a: T, b: T) -> T) { ¬(a ∣ b) } [infix { like × }] + ++ ((a: T, b: T) -> T) [alias add, infix { associativity <, looser_than × }] +- ((a: T, b: T) -> T) [alias { −, sub }, infix { like + }] + +« ((a: T, b: T) -> T) [alias { <<, shl }, infix { associativity <, looser_than + }] +» ((a: T, b: T) -> T) [alias { >>, shr }, infix { like « }] + +∧ ((a: bool, b: bool) -> bool) { a & b } [infix { associativity <, looser_than « }] +& ((a: T, b: T) -> T) [alias and, infix { like ∧ }] +impl bool { + ∧ ((a, b: λ(() -> me)) -> me) { + match a { + true => b (), + false => false, + } + } +} + +^ ((a: T, b: T) -> T) [alias xor, infix { associativity <, looser_than & }] + +∨ ((a: bool, b: bool) -> bool) { a | b } [infix { associativity <, looser_than ^}] +impl bool { + ∨ ((a, b: λ(() -> me)) -> me) { + match a { + true => true, + false => b (), + } + } +} +| ((a: T, b: T) -> T) [alias or, infix { like ∨ }] + +≡ ((a: T, b: T) -> bool) [alias { ==, eq }, infix { associativity none, looser_than | }] +≢ ((a: T, b: T) -> bool) { ¬(a ≡ b) } [alias { ≠, !=, ne }, infix { like ≡ }] +> ((a: T, b: T) -> bool) [alias { gt }, infix { like ≡ }] +< ((a: T, b: T) -> bool) [alias { lt }, infix { like ≡ }] +≤ ((a: T, b: T) -> bool) [alias { <=, ≯, le }, infix { like ≡ }] +≥ ((a: T, b: T) -> bool) [alias { >=, ≮, ge }, infix { like ≡ }] + +impl each int { + ¬ (a -> me) { intrinsics::complement a } + - (a -> me) { intrinsics::negate a } + × ((a, b) -> me) { a intrinsics::mul b } + ÷ ((a, b) -> me) { a intrinsics::div b } + rem ((a, b) -> me) { a intrinsics::rem b } + .. + ≡ ((a, b) -> bool) { a intrinsics::eq b } + & ((a, b) -> me) { a intrinsics::bitand b } +} + +impl each uint { + mod ((a, b) -> me) rem +} + +impl each sint { + abs ((x) -> me) { + match x { + ..0 => x × -1, + 0.. => x, + } + } + mod ((a, b) -> me) { + match a % b { + x @ ..0 => x + abs x, + x @ 0.. => x, + } + } +} + +mod iterators { + next (me => T) [postfix] + map ((i: T, fn: λ (T -> U)) -> mapper[T, U]) { mapper { inner: i, fn } } [postfix] + + struct mapper { + inner: T, + fn: λ (T -> U) + } + + next (me { inner, fn }: mapper[T] -> U) { fn (inner next) } +} |