mers rewrite is starting to be usable

This commit is contained in:
Mark
2023-08-14 17:17:08 +02:00
parent e549b1a5be
commit 2a7cb08596
50 changed files with 1411 additions and 407 deletions

0
mers/src/cfg_globals.rs Normal file → Executable file
View File

View 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)
}
}
}
}

View File

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