Skip to main content

PREAMBLE

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";