TropicSapling/triforce

Make it possible to define numbers in P+ code

Opened this issue · 0 comments

http://learnyouanagda.liamoc.net/pages/peano.html#fn4

EDIT: May be a bit unnecessary since the macros will get converted into numbers anyway which still have to be parsed by the compiler.

Some potential ways to do this in P+ code:

type Nat extends const list;

Nat nat = [
    macro Zero,
    macro One,
    macro suc (Nat n) {
        if n == Zero
            One
        else if n == One || n[Zero] == One
            [Zero, n]
        else [One, n[One]]
    },
    macro pred (Nat n) {
        if n == Zero || n == One
            Zero
        else if n[Zero] == One
            [Zero, n[One]]
        else n[One]
    }
];

macro (Nat a) + (Nat b) -> Nat {
    if a == nat.Zero && b == nat.Zero
        nat.Zero
    else if a == nat.Zero
        b
    else if b == nat.Zero
        a
    else
        nat.suc ((nat.pred a) + b)
}

macro parse_numbers (TokenList tokens) {
    def_macro ten as nat.suc nat.suc nat.suc nat.suc nat.suc nat.suc nat.suc nat.suc nat.suc nat.One;
    
    let new_tokens = [];
    for token in tokens {
        if token.Type == TokenType.Number && token[nat.One] == nat.Zero {
            let exp = nat.Zero;
            let repeats = nat.Zero;
            let new_str = "";
            for c in reverse token[nat.Zero] {
                repeat c to_num * ten ** exp {
                    new_str += "nat.suc (";
                    repeats += nat.One;
                }
                
                exp += nat.One;
            }
            
            new_str += "nat.Zero";
            
            repeat repeats {
                new_str += ")";
            }
            
            new_tokens += tokenify new_str;
        } else new_tokens += token;
    }
    
    new_tokens
}