1
0

Pass all tests

This commit is contained in:
Jeff 2024-03-24 15:47:23 -04:00
parent 966983920e
commit 2871fd125a
5 changed files with 27 additions and 16 deletions

View File

@ -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(());
} }
} }

View File

@ -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 {

View File

@ -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)) => {

View File

@ -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(_) => {}

View File

@ -3,7 +3,7 @@ io = {
__READ_LINE__() __READ_LINE__()
} }
write_line = (T)(output: T) none { write_line = (output: str) none {
__WRITE_LINE__(output) __WRITE_LINE__(output)
} }
} }