aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2021-11-25 20:22:42 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2021-11-25 20:25:36 +0200
commit0e7d993c662652d57bef9c197495fc74d4c6facc (patch)
tree6e34e4f16b5256072e6a38d7870456d11e1e32f0 /src
parenta4478224d907ca5cb729cebe9f162c1920ec3fff (diff)
Refactor nonary builtins
Diffstat (limited to 'src')
-rw-r--r--src/builtins.rs39
-rw-r--r--src/grammar.pest2
-rw-r--r--src/main.rs3
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();