Constant PREAMBLE
Source const PREAMBLE: &str = "#!/bin/false\n// Note: module inlining is NOT performed for this file.\n\npub mod builtin_preamble {\n //! Conlang functions which are loaded into the default REPL\n //! \n //! Contains generally-useful functions which don\'t require\n //! special functionality that the Conlang interpreter\n //! doesn\'t yet have.\n \n enum Option<T> { Some(T), None }\n enum Result<T, E> { Ok(T), Err(E) }\n let Some, None, Ok, Err = {\n Option::Some, Option::None, Result::Ok, Result::Err\n } // TODO: implement `use`\n\n pub fn max<T: Cmp>(a: T, b: T) -> T = if a < b b else a;\n pub fn min<T: Cmp>(a: T, b: T) -> T = if a > b b else a;\n pub fn sqrt(mut n: f64) -> f64 {\n const let EPSILON: f64 = 8.8541878188 / 1000000000000.0;\n if n < 0.0 return f64::NaN; // TODO: re-uppercase\n if n == 0.0 return 0.0;\n let z = n;\n loop {\n let adj = (z * z - n) / (2.0 * z);\n z -= adj;\n if (if adj >= 0.0 adj else -adj) < EPSILON break z;\n }\n }\n\n pub fn as_digit(n: u32) -> char = match n {\n ..10 => n + \'0\' as u32;\n _ => n - 10 + \'a\' as u32;\n } as char;\n pub fn radix(n: i64, radix: i64) {\n fn recurse(n: i64, radix: i64) = if n == 0 \"\" else {\n recurse(n / radix, radix) + as_digit(n % radix)\n }\n\n match n {\n 0 => \"0\";\n // TODO: breaks at i64::MIN\n ..0 => \"-\" + recurse(-n, radix);\n _ => recurse(n, radix);\n }\n }\n pub fn count_leading_zeroes(n: u128) -> u128 {\n let mut xd = u128::BITS;\n if n < 0 return 0;\n while n != 0 {\n xd -= 1;\n n >>= 1;\n }\n xd\n }\n pub fn hex(n: u128) {\n let out = \"0x\";\n for xd in min(count_leading_zeroes(n) / 4, 31)..32 {\n out += as_digit(n >> (31 - xd) * 4 & 0xf)\n }\n out\n }\n pub fn oct(n: u128) {\n let out = \"0o\";\n for xd in min((count_leading_zeroes(n) + 1) / 3, 42)..43 {\n out += as_digit(n >> (42 - xd) * 3 & 7)\n }\n out\n }\n pub fn bin(n: u128) {\n let out = \"0b\";\n for xd in min(count_leading_zeroes(n), 127)..128 {\n out += as_digit(n >> 127 - xd & 1)\n }\n out\n }\n pub fn shark() = \'\\u{1f988}\';\n}\n";