mirror of
https://github.com/Dummi26/mers.git
synced 2025-12-14 11:16:17 +01:00
assigning to tuples should work properly now
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use crate::{
|
||||
data::{self, Data, MersType, Type},
|
||||
data::{self, Data, Type},
|
||||
program::run::{CheckInfo, Info},
|
||||
};
|
||||
|
||||
@@ -18,7 +18,6 @@ impl Config {
|
||||
info: Arc::new(Info::neverused()),
|
||||
info_check: Arc::new(Mutex::new(CheckInfo::neverused())),
|
||||
out: Arc::new(|a, i| {
|
||||
dbg!(a);
|
||||
let mut o = Type::empty();
|
||||
for t in &a.types {
|
||||
if let Some(t) = t.as_any().downcast_ref::<data::function::FunctionT>() {
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::program;
|
||||
use crate::{parsing::SourcePos, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct AssignTo {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub target: Box<dyn MersStatement>,
|
||||
pub source: Box<dyn MersStatement>,
|
||||
}
|
||||
@@ -18,6 +19,7 @@ impl MersStatement for AssignTo {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
Ok(Box::new(program::run::assign_to::AssignTo {
|
||||
pos_in_src: self.pos_in_src,
|
||||
is_init: false,
|
||||
target: self.target.compile(info, comp)?,
|
||||
source: self.source.compile(info, comp)?,
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::{info, program};
|
||||
use crate::{info, parsing::SourcePos, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Block {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub statements: Vec<Box<dyn MersStatement>>,
|
||||
}
|
||||
impl MersStatement for Block {
|
||||
@@ -16,6 +17,7 @@ impl MersStatement for Block {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
Ok(Box::new(program::run::block::Block {
|
||||
pos_in_src: self.pos_in_src,
|
||||
statements: self
|
||||
.statements
|
||||
.iter()
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
use crate::parsing::SourcePos;
|
||||
use crate::{info, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Chain {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub first: Box<dyn MersStatement>,
|
||||
pub chained: Box<dyn MersStatement>,
|
||||
}
|
||||
@@ -17,6 +19,7 @@ impl MersStatement for Chain {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
Ok(Box::new(program::run::chain::Chain {
|
||||
pos_in_src: self.pos_in_src,
|
||||
first: self.first.compile(info, comp)?,
|
||||
chained: self.chained.compile(info, comp)?,
|
||||
}))
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use crate::parsing::SourcePos;
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use crate::{
|
||||
@@ -9,6 +10,7 @@ use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Function {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub arg: Box<dyn MersStatement>,
|
||||
pub run: Box<dyn MersStatement>,
|
||||
}
|
||||
@@ -30,6 +32,7 @@ impl MersStatement for Function {
|
||||
let arg2 = Arc::clone(&arg_target);
|
||||
let run2 = Arc::clone(&run);
|
||||
Ok(Box::new(program::run::function::Function {
|
||||
pos_in_src: self.pos_in_src,
|
||||
func_no_info: data::function::Function {
|
||||
info: Arc::new(program::run::Info::neverused()),
|
||||
info_check: Arc::new(Mutex::new(CheckInfo::neverused())),
|
||||
@@ -38,7 +41,7 @@ impl MersStatement for Function {
|
||||
Ok(run2.check(i, None)?)
|
||||
}),
|
||||
run: Arc::new(move |arg, info| {
|
||||
data::defs::assign(arg, &arg_target.run(info));
|
||||
data::defs::assign(&arg, &arg_target.run(info));
|
||||
run.run(info)
|
||||
}),
|
||||
},
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::program;
|
||||
use crate::{parsing::SourcePos, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct If {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub condition: Box<dyn MersStatement>,
|
||||
pub on_true: Box<dyn MersStatement>,
|
||||
pub on_false: Option<Box<dyn MersStatement>>,
|
||||
@@ -19,6 +20,7 @@ impl MersStatement for If {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
Ok(Box::new(program::run::r#if::If {
|
||||
pos_in_src: self.pos_in_src,
|
||||
condition: self.condition.compile(info, comp)?,
|
||||
on_true: self.on_true.compile(info, comp)?,
|
||||
on_false: if let Some(v) = &self.on_false {
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
use crate::parsing::SourcePos;
|
||||
use crate::program;
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct InitTo {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub target: Box<dyn MersStatement>,
|
||||
pub source: Box<dyn MersStatement>,
|
||||
}
|
||||
@@ -22,6 +24,7 @@ impl MersStatement for InitTo {
|
||||
comp.is_init = false;
|
||||
let source = self.source.compile(info, comp)?;
|
||||
Ok(Box::new(program::run::assign_to::AssignTo {
|
||||
pos_in_src: self.pos_in_src,
|
||||
is_init: true,
|
||||
target,
|
||||
source,
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::{info, program};
|
||||
use crate::{info, parsing::SourcePos, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Tuple {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub elems: Vec<Box<dyn MersStatement>>,
|
||||
}
|
||||
impl MersStatement for Tuple {
|
||||
@@ -16,6 +17,7 @@ impl MersStatement for Tuple {
|
||||
comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
Ok(Box::new(program::run::tuple::Tuple {
|
||||
pos_in_src: self.pos_in_src,
|
||||
elems: self
|
||||
.elems
|
||||
.iter()
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
use crate::parsing::SourcePos;
|
||||
use crate::{data::Data, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Value(pub Data);
|
||||
pub struct Value {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub data: Data,
|
||||
}
|
||||
|
||||
impl MersStatement for Value {
|
||||
fn has_scope(&self) -> bool {
|
||||
@@ -15,7 +19,8 @@ impl MersStatement for Value {
|
||||
_comp: CompInfo,
|
||||
) -> Result<Box<dyn program::run::MersStatement>, String> {
|
||||
Ok(Box::new(program::run::value::Value {
|
||||
val: self.0.clone(),
|
||||
pos_in_src: self.pos_in_src,
|
||||
val: self.data.clone(),
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::{info::Local, program};
|
||||
use crate::{info::Local, parsing::SourcePos, program};
|
||||
|
||||
use super::{CompInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Variable {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub is_ref: bool,
|
||||
pub var: String,
|
||||
}
|
||||
@@ -27,6 +28,7 @@ impl MersStatement for Variable {
|
||||
)
|
||||
}
|
||||
Ok(Box::new(program::run::variable::Variable {
|
||||
pos_in_src: self.pos_in_src,
|
||||
is_init: comp.is_init,
|
||||
is_ref: comp.is_init || self.is_ref,
|
||||
var: if let Some(v) = info.get_var(&self.var) {
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
use crate::data::{self, Type};
|
||||
use crate::{
|
||||
data::{self, Type},
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
use super::{CheckError, CheckInfo, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct AssignTo {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub is_init: bool,
|
||||
pub target: Box<dyn MersStatement>,
|
||||
pub source: Box<dyn MersStatement>,
|
||||
@@ -27,10 +31,13 @@ impl MersStatement for AssignTo {
|
||||
fn run_custom(&self, info: &mut super::Info) -> crate::data::Data {
|
||||
let source = self.source.run(info);
|
||||
let target = self.target.run(info);
|
||||
data::defs::assign(source, &target);
|
||||
data::defs::assign(&source, &target);
|
||||
target
|
||||
}
|
||||
fn has_scope(&self) -> bool {
|
||||
false
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
use crate::data::Type;
|
||||
use crate::{data::Type, parsing::SourcePos};
|
||||
|
||||
use super::{CheckError, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Block {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub statements: Vec<Box<dyn MersStatement>>,
|
||||
}
|
||||
impl MersStatement for Block {
|
||||
@@ -31,4 +32,7 @@ impl MersStatement for Block {
|
||||
fn has_scope(&self) -> bool {
|
||||
true
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::data::{Data, Type};
|
||||
use crate::{
|
||||
data::{Data, Type},
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
use super::{CheckError, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Chain {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub first: Box<dyn MersStatement>,
|
||||
pub chained: Box<dyn MersStatement>,
|
||||
}
|
||||
@@ -54,4 +58,7 @@ impl MersStatement for Chain {
|
||||
fn has_scope(&self) -> bool {
|
||||
false
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::data::{self, Data, MersData, Type};
|
||||
use crate::{
|
||||
data::{self, Data, MersData, Type},
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
use super::{CheckError, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Function {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub func_no_info: data::function::Function,
|
||||
}
|
||||
|
||||
@@ -29,4 +33,7 @@ impl MersStatement for Function {
|
||||
fn has_scope(&self) -> bool {
|
||||
true
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::data::{self, Data, MersType, Type};
|
||||
use crate::{
|
||||
data::{self, Data, MersType, Type},
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
use super::{CheckError, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct If {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub condition: Box<dyn MersStatement>,
|
||||
pub on_true: Box<dyn MersStatement>,
|
||||
pub on_false: Option<Box<dyn MersStatement>>,
|
||||
@@ -55,4 +59,7 @@ impl MersStatement for If {
|
||||
fn has_scope(&self) -> bool {
|
||||
true
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ use std::{
|
||||
use crate::{
|
||||
data::{self, Data, Type},
|
||||
info,
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
#[cfg(feature = "run")]
|
||||
@@ -34,6 +35,7 @@ pub trait MersStatement: Debug + Send + Sync {
|
||||
fn run_custom(&self, info: &mut Info) -> Data;
|
||||
/// if true, local variables etc. will be contained inside their own scope.
|
||||
fn has_scope(&self) -> bool;
|
||||
fn pos_in_src(&self) -> &SourcePos;
|
||||
fn check(&self, info: &mut CheckInfo, assign: Option<&Type>) -> Result<Type, CheckError> {
|
||||
if self.has_scope() {
|
||||
info.create_scope();
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use crate::data::{self, tuple::TupleT, Data, Type};
|
||||
use crate::{
|
||||
data::{self, tuple::TupleT, Data, Type},
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
use super::{CheckError, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Tuple {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub elems: Vec<Box<dyn MersStatement>>,
|
||||
}
|
||||
impl MersStatement for Tuple {
|
||||
@@ -31,7 +35,7 @@ impl MersStatement for Tuple {
|
||||
}
|
||||
} else {
|
||||
return Err(CheckError(
|
||||
"can't init to statement type Tuple with value type {t}, which is part of {init_to} - only tuples can be assigned to tuples".to_string(),
|
||||
format!("can't init to statement type Tuple with value type {t}, which is part of {init_to} - only tuples can be assigned to tuples"),
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -64,4 +68,7 @@ impl MersStatement for Tuple {
|
||||
fn has_scope(&self) -> bool {
|
||||
false
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,13 @@
|
||||
use crate::data::{Data, Type};
|
||||
use crate::{
|
||||
data::{Data, Type},
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
use super::{CheckError, MersStatement};
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Value {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub val: Data,
|
||||
}
|
||||
|
||||
@@ -24,4 +28,7 @@ impl MersStatement for Value {
|
||||
fn run_custom(&self, _info: &mut super::Info) -> Data {
|
||||
self.val.clone()
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
use std::sync::{Arc, Mutex};
|
||||
|
||||
use crate::data::{self, Data, Type};
|
||||
use crate::{
|
||||
data::{self, Data, Type},
|
||||
parsing::SourcePos,
|
||||
};
|
||||
|
||||
use super::MersStatement;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Variable {
|
||||
pub pos_in_src: SourcePos,
|
||||
pub is_init: bool,
|
||||
pub is_ref: bool,
|
||||
pub var: (usize, usize),
|
||||
@@ -55,4 +59,7 @@ impl MersStatement for Variable {
|
||||
.clone()
|
||||
}
|
||||
}
|
||||
fn pos_in_src(&self) -> &SourcePos {
|
||||
&self.pos_in_src
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user