mirror of
https://github.com/Dummi26/mers.git
synced 2025-12-28 17:16:31 +01:00
assigning to tuples should work properly now
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user