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 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: u64) -> u64 {\n let mut xd = u64::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: u64) {\n let out = \"0x\";\n for xd in min(count_leading_zeroes(n) / 4, 15)..16 {\n out += as_digit((n >> (15 - xd) * 4) & 0xf)\n }\n out\n }\n pub fn oct(n: u64) {\n let out = \"0o\";\n for xd in min((count_leading_zeroes(n) + 2) / 3, 21)..22 {\n out += as_digit((n >> max(63 - (3 * xd), 0)) & 7)\n }\n out\n }\n pub fn bin(n: u64) {\n let out = \"0b\";\n for xd in min(count_leading_zeroes(n), 63)..64 {\n out += as_digit((n >> 63 - xd) & 1)\n }\n out\n }\n pub fn shark() = \'\\u{1f988}\';\n}\n";