diff options
author | Vincent Ambo <mail@tazj.in> | 2021-01-17T09·13+0300 |
---|---|---|
committer | tazjin <mail@tazj.in> | 2021-01-17T09·34+0000 |
commit | f8b3e2a100fdb28cad24948703439d2964c31580 (patch) | |
tree | fdd7b13f4a359532f6acaa183d78e7d777f5c32d /users/tazjin/rlox/src/interpreter | |
parent | 052f8976bb3273d16fb0e1c4643de5abcaf0f135 (diff) |
refactor(tazjin/rlox): Move treewalk interpreter into subdirectory r/2120
Change-Id: I9163f75db5a1ff75e1b1f81bad78fd9d8ddb104a Reviewed-on: https://cl.tvl.fyi/c/depot/+/2409 Reviewed-by: tazjin <mail@tazj.in> Tested-by: BuildkiteCI
Diffstat (limited to 'users/tazjin/rlox/src/interpreter')
-rw-r--r-- | users/tazjin/rlox/src/interpreter/builtins.rs | 25 | ||||
-rw-r--r-- | users/tazjin/rlox/src/interpreter/tests.rs | 101 |
2 files changed, 0 insertions, 126 deletions
diff --git a/users/tazjin/rlox/src/interpreter/builtins.rs b/users/tazjin/rlox/src/interpreter/builtins.rs deleted file mode 100644 index 6ed9f07c3ffa..000000000000 --- a/users/tazjin/rlox/src/interpreter/builtins.rs +++ /dev/null @@ -1,25 +0,0 @@ -use std::fmt; -use std::time::{SystemTime, UNIX_EPOCH}; - -use crate::errors::Error; -use crate::interpreter::Value; -use crate::parser::Literal; - -pub trait Builtin: fmt::Debug { - fn arity(&self) -> usize; - fn call(&self, args: Vec<Value>) -> Result<Value, Error>; -} - -// Builtin to return the current timestamp. -#[derive(Debug)] -pub struct Clock {} -impl Builtin for Clock { - fn arity(&self) -> usize { - 0 - } - - fn call(&self, _args: Vec<Value>) -> Result<Value, Error> { - let now = SystemTime::now().duration_since(UNIX_EPOCH).unwrap(); - Ok(Value::Literal(Literal::Number(now.as_secs() as f64))) - } -} diff --git a/users/tazjin/rlox/src/interpreter/tests.rs b/users/tazjin/rlox/src/interpreter/tests.rs deleted file mode 100644 index 34b1df34b0b6..000000000000 --- a/users/tazjin/rlox/src/interpreter/tests.rs +++ /dev/null @@ -1,101 +0,0 @@ -use super::*; - -/// Evaluate a code snippet, returning a value. -fn parse_eval(code: &str) -> Value { - let chars: Vec<char> = code.chars().collect(); - let tokens = scanner::scan(&chars).expect("could not scan code"); - let program = parser::parse(tokens).expect("could not parse code"); - - Interpreter::create() - .interpret(program) - .expect("could not eval code") -} - -#[test] -fn test_if() { - let result = parse_eval( - r#" -if (42 > 23) - "pass"; -else - "fail"; -"#, - ); - - assert_eq!(Value::Literal(Literal::String("pass".into())), result,); -} - -#[test] -fn test_scope() { - let result = parse_eval( - r#" -var result = ""; - -var a = "global a, "; -var b = "global b, "; -var c = "global c"; - -{ - var a = "outer a, "; - var b = "outer b, "; - - { - var a = "inner a, "; - result = a + b + c; - } -} -"#, - ); - - assert_eq!( - Value::Literal(Literal::String("inner a, outer b, global c".into())), - result, - ); -} - -#[test] -fn test_binary_operators() { - assert_eq!(Value::Literal(Literal::Number(42.0)), parse_eval("40 + 2;")); - - assert_eq!( - Value::Literal(Literal::String("foobar".into())), - parse_eval("\"foo\" + \"bar\";") - ); -} - -#[test] -fn test_functions() { - let result = parse_eval( - r#" -fun add(a, b, c) { - a + b + c; -} - -add(1, 2, 3); -"#, - ); - - assert_eq!(Value::Literal(Literal::Number(6.0)), result); -} - -#[test] -fn test_closure() { - let result = parse_eval( - r#" -fun makeCounter() { - var i = 0; - fun count() { - i = i + 1; - } - - return count; -} - -var counter = makeCounter(); -counter(); // "1". -counter(); // "2". -"#, - ); - - assert_eq!(Value::Literal(Literal::Number(2.0)), result); -} |