Make it possible to define numbers in P+ code
Opened this issue · 0 comments
TropicSapling commented
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
}