diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2021-11-25 20:22:42 +0200 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2021-11-25 20:25:36 +0200 |
| commit | 0e7d993c662652d57bef9c197495fc74d4c6facc (patch) | |
| tree | 6e34e4f16b5256072e6a38d7870456d11e1e32f0 | |
| parent | a4478224d907ca5cb729cebe9f162c1920ec3fff (diff) | |
Refactor nonary builtins
| -rw-r--r-- | src/builtins.rs | 39 | ||||
| -rw-r--r-- | src/grammar.pest | 2 | ||||
| -rw-r--r-- | src/main.rs | 3 |
3 files changed, 20 insertions, 24 deletions
diff --git a/src/builtins.rs b/src/builtins.rs index 2d82f96..652fb3b 100644 --- a/src/builtins.rs +++ b/src/builtins.rs @@ -65,29 +65,15 @@ fn argument_n_error(builtin_id: &'static str, n: usize) -> Result<(Rc<Term>, usi macro_rules! boolean_function { ($value:expr) => { match $value { - true => make_boolean_true_function(), - false => make_boolean_false_function(), + true => Term::Builtin(Builtin::new(B_TRUE, 0)), + false => Term::Builtin(Builtin::new(B_FALSE, 0)), } }; } -pub fn make_boolean_true_function() -> Term { - let x = advance_v(); - let y = advance_v(); - Term::Abstraction(x, Rc::new(Term::Abstraction(y, Rc::new(Term::Variable(x))))) -} - -pub fn make_boolean_false_function() -> Term { - let x = advance_v(); - let y = advance_v(); - Term::Abstraction(x, Rc::new(Term::Abstraction(y, Rc::new(Term::Variable(y))))) -} - -pub fn make_identity_function() -> Term { - let v = advance_v(); - Term::Abstraction(v, Rc::new(Term::Variable(v))) -} - +pub const B_TRUE: &str = "true"; +pub const B_FALSE: &str = "false"; +pub const B_ID: &str = "id"; pub const B_INTEGER_EQ: &str = "int.eq?"; pub const B_INTEGER_INCREMENT: &str = "int.inc"; pub const B_INTEGER_ADD: &str = "int.add"; @@ -102,9 +88,9 @@ pub const C_PRINTLN: &str = "PrintLn"; pub fn try_ast_symbol_to_builtin_term(symbol: &str) -> Option<Term> { let builtin = match symbol { - "true" => return Some(make_boolean_true_function()), - "false" => return Some(make_boolean_false_function()), - "id" => return Some(make_identity_function()), + B_TRUE => Builtin::new(B_TRUE, 0), + B_FALSE => Builtin::new(B_FALSE, 0), + B_ID => Builtin::new(B_ID, 0), B_INTEGER_EQ => Builtin::new(B_INTEGER_EQ, 2), B_INTEGER_INCREMENT => Builtin::new(B_INTEGER_INCREMENT, 1), B_INTEGER_ADD => Builtin::new(B_INTEGER_ADD, 2), @@ -122,6 +108,15 @@ pub fn try_ast_symbol_to_builtin_term(symbol: &str) -> Option<Term> { pub fn evaluate_builtin(builtin: &Builtin, rhs: Rc<Term>) -> Result<(Rc<Term>, usize), String> { let result_term = match builtin.identifier { + B_TRUE => { + let y = advance_v(); + Term::Abstraction(y, rhs) + } + B_FALSE => { + let y = advance_v(); + Term::Abstraction(y, Rc::new(Term::Variable(y))) + } + B_ID => return Ok((rhs, 1)), B_INTEGER_EQ => match &*rhs { Term::Primitive(primitive @ Value::Integer(value)) => match builtin.n_arguments { 2 => Term::Builtin(builtin.bind_arg(primitive)), diff --git a/src/grammar.pest b/src/grammar.pest index 3db5519..89d1b5a 100644 --- a/src/grammar.pest +++ b/src/grammar.pest @@ -6,4 +6,4 @@ definition = { symbol+ ~ "=" ~ expression } expression = { (symbol | integer_literal | string_literal | ("(" ~ expression ~ ")"))+ } integer_literal = @{ "-"? ~ ASCII_DIGIT+ } string_literal = { QUOTATION_MARK ~ (!QUOTATION_MARK ~ ANY)* ~ QUOTATION_MARK } -symbol = @{ (ASCII_ALPHA | "_.") ~ (ASCII_ALPHANUMERIC | "-" | "." | "?" | "!")* } +symbol = @{ (ASCII_ALPHA | "_") ~ (ASCII_ALPHANUMERIC | "-" | "." | "?" | "!")* } diff --git a/src/main.rs b/src/main.rs index d27f1d5..0ece43b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -33,7 +33,8 @@ fn main() -> Result<(), String> { let command = args.next().unwrap(); let subcommand_result = args.next(); if subcommand_result.is_none() { - println!("usage: {c} run FILE\n {c} repl", c = command.as_str()); + println!("usage: {} run FILE", command.as_str()); + println!(" {} repl", command.as_str()); return Ok(()); } let subcommand = subcommand_result.unwrap(); |
