Massive feature drop

- pattern matching seems to be correct
- dynamic dispatch works with the to_string example
- template strings as a last-minute addition
- interpreter revamp, virtual stack for abort safety
This commit is contained in:
2024-01-29 18:26:56 +00:00
parent a8887227e5
commit c279301583
71 changed files with 947 additions and 932 deletions

View File

@@ -3,7 +3,7 @@ use std::iter;
use std::rc::Rc;
use crate::foreign::atom::Atomic;
use crate::foreign::fn_bridge::constructors::xfn_1ary;
use crate::foreign::fn_bridge::xfn;
use crate::foreign::process::Unstable;
use crate::foreign::to_clause::ToClause;
use crate::foreign::try_from_expr::TryFromExpr;
@@ -37,12 +37,11 @@ fn table_receiver_rec<
callback: impl DeferredRuntimeCallback<T, U, R>,
) -> impl Atomic {
let t = remaining_keys.pop_front().expect("empty handled elsewhere");
xfn_1ary(move |u: U| {
xfn("__table_receiver__", move |u: U| {
let results = pushed(results, (t, u));
match remaining_keys.is_empty() {
true => callback(results).to_clause(CodeLocation::Source(range)),
false =>
table_receiver_rec(range, results, remaining_keys, callback).atom_cls(),
false => table_receiver_rec(range, results, remaining_keys, callback).atom_cls(),
}
})
}
@@ -59,10 +58,8 @@ fn table_receiver<
if keys.is_empty() {
Unstable::new(move |_| callback(Vec::new())).ast_cls()
} else {
Unstable::new(move |_| {
table_receiver_rec(range, Vec::new(), keys, callback).atom_cls()
})
.ast_cls()
Unstable::new(move |_| table_receiver_rec(range, Vec::new(), keys, callback).atom_cls())
.ast_cls()
}
}
@@ -77,10 +74,8 @@ pub fn defer_to_runtime<
pairs: impl IntoIterator<Item = (T, Vec<parsed::Expr>)>,
callback: impl DeferredRuntimeCallback<T, U, R>,
) -> parsed::Clause {
let (keys, ast_values) =
pairs.into_iter().unzip::<_, _, VecDeque<_>, Vec<_>>();
let items = iter::once(table_receiver(range.clone(), keys, callback)).chain(
ast_values.into_iter().map(|v| parsed::Clause::S(PType::Par, Rc::new(v))),
);
let (keys, ast_values) = pairs.into_iter().unzip::<_, _, VecDeque<_>, Vec<_>>();
let items = iter::once(table_receiver(range.clone(), keys, callback))
.chain(ast_values.into_iter().map(|v| parsed::Clause::S(PType::Par, Rc::new(v))));
parsed::Clause::s('(', items, range)
}