Pass all tests
This commit is contained in:
parent
966983920e
commit
2871fd125a
@ -113,7 +113,18 @@ impl Type {
|
|||||||
return_type: right_return,
|
return_type: right_return,
|
||||||
},
|
},
|
||||||
) => {
|
) => {
|
||||||
if left_return == right_return && left_parameters == right_parameters {
|
if left_return.node == right_return.node {
|
||||||
|
for (left_parameter, right_parameter) in
|
||||||
|
left_parameters.iter().zip(right_parameters.iter())
|
||||||
|
{
|
||||||
|
if left_parameter.node != right_parameter.node {
|
||||||
|
return Err(TypeConflict {
|
||||||
|
actual: other.clone(),
|
||||||
|
expected: self.clone(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,8 @@ pub use value::Value;
|
|||||||
pub fn interpret<'src>(source_id: &str, source: &str) -> Result<Option<Value>, InterpreterError> {
|
pub fn interpret<'src>(source_id: &str, source: &str) -> Result<Option<Value>, InterpreterError> {
|
||||||
let mut interpreter = Interpreter::new(Context::new());
|
let mut interpreter = Interpreter::new(Context::new());
|
||||||
|
|
||||||
interpreter.run(Rc::new(source_id.to_string()), Rc::from(source))
|
interpreter.load_std()?;
|
||||||
|
interpreter.run(Rc::from(source_id), Rc::from(source))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn interpret_without_std(
|
pub fn interpret_without_std(
|
||||||
@ -28,12 +29,12 @@ pub fn interpret_without_std(
|
|||||||
) -> Result<Option<Value>, InterpreterError> {
|
) -> Result<Option<Value>, InterpreterError> {
|
||||||
let mut interpreter = Interpreter::new(Context::new());
|
let mut interpreter = Interpreter::new(Context::new());
|
||||||
|
|
||||||
interpreter.run(Rc::new(source_id.to_string()), Rc::from(source))
|
interpreter.run(Rc::from(source_id.to_string()), Rc::from(source))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Interpreter {
|
pub struct Interpreter {
|
||||||
context: Context,
|
context: Context,
|
||||||
sources: Rc<RefCell<Vec<(Rc<String>, Rc<str>)>>>,
|
sources: Rc<RefCell<Vec<(Rc<str>, Rc<str>)>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Interpreter {
|
impl Interpreter {
|
||||||
@ -46,7 +47,7 @@ impl Interpreter {
|
|||||||
|
|
||||||
pub fn run(
|
pub fn run(
|
||||||
&mut self,
|
&mut self,
|
||||||
source_id: Rc<String>,
|
source_id: Rc<str>,
|
||||||
source: Rc<str>,
|
source: Rc<str>,
|
||||||
) -> Result<Option<Value>, InterpreterError> {
|
) -> Result<Option<Value>, InterpreterError> {
|
||||||
let tokens = lex(source.as_ref()).map_err(|errors| InterpreterError {
|
let tokens = lex(source.as_ref()).map_err(|errors| InterpreterError {
|
||||||
@ -69,7 +70,7 @@ impl Interpreter {
|
|||||||
Ok(value_option)
|
Ok(value_option)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run_all<T: IntoIterator<Item = (Rc<String>, Rc<str>)>>(
|
pub fn run_all<T: IntoIterator<Item = (Rc<str>, Rc<str>)>>(
|
||||||
&mut self,
|
&mut self,
|
||||||
sources: T,
|
sources: T,
|
||||||
) -> Result<Option<Value>, InterpreterError> {
|
) -> Result<Option<Value>, InterpreterError> {
|
||||||
@ -85,24 +86,24 @@ impl Interpreter {
|
|||||||
pub fn load_std(&mut self) -> Result<Option<Value>, InterpreterError> {
|
pub fn load_std(&mut self) -> Result<Option<Value>, InterpreterError> {
|
||||||
self.run_all([
|
self.run_all([
|
||||||
(
|
(
|
||||||
Rc::new("std/io.ds".to_string()),
|
Rc::from("std/io.ds"),
|
||||||
Rc::from(include_str!("../../std/io.ds")),
|
Rc::from(include_str!("../../std/io.ds")),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
Rc::new("std/thread.ds".to_string()),
|
Rc::from("std/thread.ds"),
|
||||||
Rc::from(include_str!("../../std/thread.ds")),
|
Rc::from(include_str!("../../std/thread.ds")),
|
||||||
),
|
),
|
||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn sources(&self) -> vec::IntoIter<(Rc<String>, Rc<str>)> {
|
pub fn sources(&self) -> vec::IntoIter<(Rc<str>, Rc<str>)> {
|
||||||
self.sources.borrow().clone().into_iter()
|
self.sources.borrow().clone().into_iter()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct InterpreterError {
|
pub struct InterpreterError {
|
||||||
source_id: Rc<String>,
|
source_id: Rc<str>,
|
||||||
errors: Vec<Error>,
|
errors: Vec<Error>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -113,7 +114,7 @@ impl InterpreterError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl InterpreterError {
|
impl InterpreterError {
|
||||||
pub fn build_reports<'a>(self) -> Vec<Report<'a, (Rc<String>, Range<usize>)>> {
|
pub fn build_reports<'a>(self) -> Vec<Report<'a, (Rc<str>, Range<usize>)>> {
|
||||||
let mut reports = Vec::new();
|
let mut reports = Vec::new();
|
||||||
|
|
||||||
for error in self.errors {
|
for error in self.errors {
|
||||||
|
@ -80,8 +80,7 @@ pub fn run_shell(context: Context) -> Result<(), io::Error> {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
let run_result =
|
let run_result = interpreter.run(Rc::from("input"), Rc::from(buffer.as_str()));
|
||||||
interpreter.run(Rc::new("input".to_string()), Rc::from(buffer.as_str()));
|
|
||||||
|
|
||||||
match run_result {
|
match run_result {
|
||||||
Ok(Some(value)) => {
|
Ok(Some(value)) => {
|
||||||
|
@ -49,9 +49,9 @@ fn main() {
|
|||||||
let (source_id, source) = if let Some(path) = args.path {
|
let (source_id, source) = if let Some(path) = args.path {
|
||||||
let source = read_to_string(&path).unwrap();
|
let source = read_to_string(&path).unwrap();
|
||||||
|
|
||||||
(Rc::new(path.to_string()), source)
|
(Rc::from(path), source)
|
||||||
} else if let Some(command) = args.command {
|
} else if let Some(command) = args.command {
|
||||||
(Rc::new("input".to_string()), command)
|
(Rc::from("input"), command)
|
||||||
} else {
|
} else {
|
||||||
match run_shell(context) {
|
match run_shell(context) {
|
||||||
Ok(_) => {}
|
Ok(_) => {}
|
||||||
|
Loading…
Reference in New Issue
Block a user