mirror of
https://github.com/Dummi26/mers.git
synced 2025-12-15 03:36:16 +01:00
mers rewrite is starting to be usable
This commit is contained in:
0
mers/src/cfg_globals.rs
Normal file → Executable file
0
mers/src/cfg_globals.rs
Normal file → Executable file
@@ -6,11 +6,14 @@ mod cfg_globals;
|
||||
|
||||
#[derive(Parser)]
|
||||
struct Args {
|
||||
#[command(subcommand)]
|
||||
command: Command,
|
||||
/// controls availability of features when compiling/running
|
||||
#[arg(long, value_enum, default_value_t = Configs::Std)]
|
||||
config: Configs,
|
||||
#[command(subcommand)]
|
||||
command: Command,
|
||||
/// perform checks to avoid runtime crashes
|
||||
#[arg(long, default_value_t = Check::Yes)]
|
||||
check: Check,
|
||||
}
|
||||
#[derive(Subcommand)]
|
||||
enum Command {
|
||||
@@ -20,6 +23,25 @@ enum Command {
|
||||
Exec { source: String },
|
||||
}
|
||||
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
|
||||
enum Check {
|
||||
No,
|
||||
Yes,
|
||||
Only,
|
||||
}
|
||||
impl Display for Check {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
"{}",
|
||||
match self {
|
||||
Self::No => "no",
|
||||
Self::Yes => "yes",
|
||||
Self::Only => "only",
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
|
||||
enum Configs {
|
||||
None,
|
||||
Base,
|
||||
@@ -42,20 +64,39 @@ fn main() {
|
||||
Configs::Base => Config::new().bundle_base(),
|
||||
Configs::Std => Config::new().bundle_std(),
|
||||
});
|
||||
let (mut info1, mut info2) = config.infos();
|
||||
match args.command {
|
||||
let (mut info_parsed, mut info_run, mut info_check) = config.infos();
|
||||
let mut source = match args.command {
|
||||
Command::Run { file } => {
|
||||
let str = fs::read_to_string(file).unwrap();
|
||||
let mut src = Source::new(str);
|
||||
let parsed = parse(&mut src).unwrap();
|
||||
let run = parsed.compile(&mut info1, Default::default()).unwrap();
|
||||
run.run(&mut info2);
|
||||
Source::new(str)
|
||||
}
|
||||
Command::Exec { source } => {
|
||||
let mut src = Source::new(source);
|
||||
let parsed = parse(&mut src).unwrap();
|
||||
let run = parsed.compile(&mut info1, Default::default()).unwrap();
|
||||
run.run(&mut info2);
|
||||
Command::Exec { source } => Source::new(source),
|
||||
};
|
||||
let parsed = parse(&mut source).unwrap();
|
||||
#[cfg(debug_assertions)]
|
||||
dbg!(&parsed);
|
||||
let run = parsed
|
||||
.compile(&mut info_parsed, Default::default())
|
||||
.unwrap();
|
||||
#[cfg(debug_assertions)]
|
||||
dbg!(&run);
|
||||
match args.check {
|
||||
Check::No => {
|
||||
run.run(&mut info_run);
|
||||
}
|
||||
Check::Yes | Check::Only => {
|
||||
let rt = match run.check(&mut info_check, None) {
|
||||
Ok(v) => v,
|
||||
Err(e) => {
|
||||
eprintln!("check failed: {e}");
|
||||
std::process::exit(36);
|
||||
}
|
||||
};
|
||||
if args.check == Check::Yes {
|
||||
run.run(&mut info_run);
|
||||
} else {
|
||||
eprintln!("return type is {}", rt)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +1 @@
|
||||
list := (
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
);
|
||||
|
||||
total := 0
|
||||
(list item -> &total = (total, item).sum).iter
|
||||
"total: ".print
|
||||
total.println
|
||||
"sum: ".print
|
||||
list.sum.println
|
||||
iter := (list item -> { item.println 12 }).map
|
||||
"---".println
|
||||
list := iter.as_list
|
||||
list.println
|
||||
list.sum.println
|
||||
list.enumerate.as_list.println
|
||||
|
||||
"mers cli: ".print
|
||||
mers_cli.println
|
||||
("a").{ (a) -> a }
|
||||
|
||||
28
mers/test2.mers
Executable file
28
mers/test2.mers
Executable file
@@ -0,0 +1,28 @@
|
||||
list := (
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
);
|
||||
|
||||
total := 0
|
||||
t := &total
|
||||
(list, item -> t = (t.deref, item).sum).iter
|
||||
"total: ".print
|
||||
total.println
|
||||
"sum: ".print
|
||||
list.sum.println
|
||||
iter := (list item -> { item.println 12 }).map
|
||||
"---".println
|
||||
list := iter.as_list
|
||||
list.println
|
||||
list.sum.println
|
||||
list.enumerate.as_list.println
|
||||
|
||||
"mers cli: ".print
|
||||
mers_cli.println
|
||||
8
mers/test3.mers
Executable file
8
mers/test3.mers
Executable file
@@ -0,0 +1,8 @@
|
||||
values := ().as_list
|
||||
counter := 0
|
||||
counter_ref := &counter
|
||||
{val -> {
|
||||
counter_ref = (counter_ref.deref, 1).sum
|
||||
counter_ref.deref.println
|
||||
if (counter_ref.deref, 5).eq { (()) } else { () }
|
||||
}}.loop
|
||||
Reference in New Issue
Block a user