aboutsummaryrefslogtreecommitdiffstats
path: root/src/builtins.rs
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2021-11-23 23:27:01 +0200
committerJan Tuomi <jans.tuomi@gmail.com>2021-11-25 09:53:44 +0200
commitc1f50fea93ad308f215e2d2878d773b55a370edb (patch)
tree317c22415a3e3a6b8526b6d58835134cffeecb17 /src/builtins.rs
parent044af4cb2dcc4e7683ceff0ecbd18d4023647eda (diff)
Builtins of one parameter working
Diffstat (limited to 'src/builtins.rs')
-rw-r--r--src/builtins.rs45
1 files changed, 43 insertions, 2 deletions
diff --git a/src/builtins.rs b/src/builtins.rs
index fa029a9..dbc17eb 100644
--- a/src/builtins.rs
+++ b/src/builtins.rs
@@ -1,7 +1,8 @@
use super::ast;
-use super::runtime::{advance_v, Term};
+use super::runtime::{advance_v, Term, Value};
use std::rc::Rc;
+pub const B_INTEGER_EQ0: &str = "int.eq0?";
pub const B_INTEGER_INCREMENT: &str = "int.increment";
pub fn make_boolean_true_function() -> Term {
@@ -21,11 +22,51 @@ pub fn make_identity_function() -> Term {
Term::Abstraction(v, Rc::new(Term::Variable(v)))
}
-pub fn try_builtin_symbol_to_term(symbol: &ast::Symbol) -> Option<Term> {
+pub fn try_ast_symbol_to_builtin_term(symbol: &ast::Symbol) -> Option<Term> {
match symbol.as_str() {
"true" => Some(make_boolean_true_function()),
"false" => Some(make_boolean_false_function()),
"id" => Some(make_identity_function()),
+ B_INTEGER_EQ0 => Some(Term::Builtin(String::from(B_INTEGER_EQ0))),
+ B_INTEGER_INCREMENT => Some(Term::Builtin(String::from(B_INTEGER_INCREMENT))),
_ => None,
}
}
+
+pub fn evaluate_builtin(symbol: &String, rhs: Rc<Term>) -> Result<(Rc<Term>, usize), String> {
+ let result_term = match symbol.as_str() {
+ B_INTEGER_EQ0 => match &*rhs {
+ Term::Primitive(primitive) => match primitive {
+ Value::Integer(value) => {
+ if *value == 0 {
+ make_boolean_true_function()
+ } else {
+ make_boolean_false_function()
+ }
+ }
+ other => {
+ return Err(format!(
+ "[runtime] cannot apply builtin {} to argument type {}",
+ symbol, other
+ ))
+ }
+ },
+ _ => return Ok((Rc::new(Term::Builtin(symbol.clone())), 0)),
+ },
+ B_INTEGER_INCREMENT => match &*rhs {
+ Term::Primitive(primitive) => match primitive {
+ Value::Integer(value) => Term::Primitive(Value::Integer(value + 1)),
+ other => {
+ return Err(format!(
+ "[runtime] cannot apply builtin {} to argument type {}",
+ symbol, other
+ ))
+ }
+ },
+ _ => return Ok((Rc::new(Term::Builtin(symbol.clone())), 0)),
+ },
+ _ => return Err(format!("[runtime] invalid builtin evaluated: {}", symbol)),
+ };
+
+ Ok((Rc::new(result_term), 1))
+}