fix: fixed erasure

This commit is contained in:
felipegchi 2022-11-24 11:01:41 -03:00
parent d1c536db01
commit 57cbe3a828
9 changed files with 67 additions and 26 deletions

View File

@ -113,6 +113,32 @@ fn lam(name: &Ident, body: Box<Term>) -> Box<Term> {
}) })
} }
fn desugar_str(input: &str, span: Span) -> Box<desugared::Expr> {
let nil = QualifiedIdent::new_static("String.nil", None, span.to_range().unwrap());
let cons = QualifiedIdent::new_static("String.cons", None, span.to_range().unwrap());
input.chars().rfold(
Box::new(desugared::Expr {
data: desugared::ExprKind::Ctr(nil, vec![]),
span,
}),
|right, chr| {
Box::new(desugared::Expr {
data: desugared::ExprKind::Ctr(
cons.clone(),
vec![
Box::new(desugared::Expr {
data: desugared::ExprKind::Num(kind_tree::Number::U60(chr as u64)),
span,
}),
right,
],
),
span,
})
},
)
}
fn codegen_str(input: &str) -> Box<Term> { fn codegen_str(input: &str) -> Box<Term> {
input.chars().rfold( input.chars().rfold(
Box::new(Term::Ctr { Box::new(Term::Ctr {
@ -267,7 +293,7 @@ fn codegen_all_expr(
eval_ctr(quote, TermTag::Hole), eval_ctr(quote, TermTag::Hole),
vec![span_to_num(expr.span), mk_u60(*num)], vec![span_to_num(expr.span), mk_u60(*num)],
), ),
Str(str) => codegen_str(str), Str(str) => codegen_all_expr(lhs_rule, lhs, num, quote, &desugar_str(str, expr.span)),
Hlp(_) => mk_lifted_ctr(eval_ctr(quote, TermTag::Hlp), vec![span_to_num(expr.span)]), Hlp(_) => mk_lifted_ctr(eval_ctr(quote, TermTag::Hlp), vec![span_to_num(expr.span)]),
Err => panic!("Internal Error: Was not expecting an ERR node inside the HVM checker"), Err => panic!("Internal Error: Was not expecting an ERR node inside the HVM checker"),
} }

View File

@ -3,4 +3,4 @@
pub mod errors; pub mod errors;
pub mod matching; pub mod matching;
pub mod open; pub mod open;
pub mod subst; pub mod subst;

View File

@ -106,7 +106,7 @@ pub fn derive_match(
let motive_ident = Ident::new_static("motive", range); let motive_ident = Ident::new_static("motive", range);
let motive_type = sum.indices.iter().rfold( let motive_type = sum.indices.iter().rfold(
mk_pi(Ident::new_static("_val", range), res_motive_ty, mk_typ()), mk_pi(Ident::new_static("val_", range), res_motive_ty, mk_typ()),
|out, arg| { |out, arg| {
mk_pi( mk_pi(
arg.name.clone(), arg.name.clone(),
@ -191,7 +191,7 @@ pub fn derive_match(
types.push(Argument { types.push(Argument {
hidden: false, hidden: false,
erased: false, erased: false,
name: Ident::new_static(&format!("_{}", cons.name.to_string()), range), name: Ident::new_static(&format!("{}_", cons.name.to_string()), range),
typ: Some(cons_type), typ: Some(cons_type),
range, range,
}); });
@ -239,11 +239,11 @@ pub fn derive_match(
spine_params = sum spine_params = sum
.parameters .parameters
.extend(&cons.args) .extend(&cons.args)
.map(|x| x.name.with_name(|f| format!("_{}", f))) .map(|x| x.name.with_name(|f| format!("{}_", f)))
.to_vec(); .to_vec();
spine = cons spine = cons
.args .args
.map(|x| x.name.with_name(|f| format!("_{}", f))) .map(|x| x.name.with_name(|f| format!("{}_", f)))
.to_vec(); .to_vec();
args_indices = args args_indices = args
.iter() .iter()
@ -261,7 +261,7 @@ pub fn derive_match(
let renames = FxHashMap::from_iter( let renames = FxHashMap::from_iter(
sum.parameters sum.parameters
.extend(&cons.args) .extend(&cons.args)
.map(|x| (x.name.to_string(), format!("_{}", x.name.to_string()))) .map(|x| (x.name.to_string(), format!("{}_", x.name.to_string())))
.iter() .iter()
.cloned(), .cloned(),
); );
@ -280,12 +280,12 @@ pub fn derive_match(
.parameters .parameters
.extend(&sum.indices) .extend(&sum.indices)
.extend(&cons.args) .extend(&cons.args)
.map(|x| x.name.with_name(|f| format!("_{}", f))) .map(|x| x.name.with_name(|f| format!("{}_", f)))
.to_vec(); .to_vec();
spine = sum spine = sum
.indices .indices
.extend(&cons.args) .extend(&cons.args)
.map(|x| x.name.with_name(|f| format!("_{}", f))) .map(|x| x.name.with_name(|f| format!("{}_", f)))
.to_vec(); .to_vec();
args_indices = sum args_indices = sum
.indices .indices

View File

@ -106,7 +106,7 @@ pub fn derive_open(range: Range, rec: &RecordDecl) -> concrete::Entry {
let spine: Vec<Ident> = rec let spine: Vec<Ident> = rec
.fields .fields
.iter() .iter()
.map(|(name, _, _)| name.with_name(|f| format!("_{}", f))) .map(|(name, _, _)| name.with_name(|f| format!("{}_", f)))
.collect(); .collect();
pats.push(Box::new(Pat { pats.push(Box::new(Pat {

View File

@ -248,7 +248,7 @@ impl<'a> DesugarState<'a> {
self.desugar_expr(res) self.desugar_expr(res)
} else { } else {
let mut idx: Vec<Ident> = sum.indices.iter().map(|x| x.name.clone()).collect(); let mut idx: Vec<Ident> = sum.indices.iter().map(|x| x.name.clone()).collect();
idx.push(Ident::generate("_val")); idx.push(Ident::generate("val_"));
idx.iter().rfold(self.gen_hole_expr(match_.typ.range), |expr, l| { idx.iter().rfold(self.gen_hole_expr(match_.typ.range), |expr, l| {
desugared::Expr::lambda(l.range, l.clone(), expr, false) desugared::Expr::lambda(l.range, l.clone(), expr, false)
}) })

View File

@ -8,19 +8,40 @@ use crate::errors::{PassError, Sugar};
use super::DesugarState; use super::DesugarState;
impl<'a> DesugarState<'a> { impl<'a> DesugarState<'a> {
pub fn check_implementation(&mut self, name: &str, range: Range, sugar: Sugar) -> bool {
if !self.old_book.names.contains_key(&name.to_string()) {
self.send_err(PassError::NeedToImplementMethods(range, sugar));
false
} else {
true
}
}
pub(crate) fn desugar_literal( pub(crate) fn desugar_literal(
&mut self, &mut self,
range: Range, range: Range,
literal: &expr::Literal, literal: &expr::Literal,
) -> Box<desugared::Expr> { ) -> Box<desugared::Expr> {
match literal { match literal {
Literal::Number(kind_tree::Number::U120(num)) => {
if !self.check_implementation("U120.new", range, Sugar::U120) {
return desugared::Expr::err(range);
}
desugared::Expr::num120(range, *num)
}
Literal::String(string) => {
if !self.check_implementation("String.cons", range, Sugar::String)
|| !self.check_implementation("String.nil", range, Sugar::String)
{
return desugared::Expr::err(range);
}
desugared::Expr::str(range, string.clone())
}
Literal::Type => desugared::Expr::typ(range), Literal::Type => desugared::Expr::typ(range),
Literal::Help(name) => desugared::Expr::hlp(range, name.clone()), Literal::Help(name) => desugared::Expr::hlp(range, name.clone()),
Literal::NumType(kind_tree::NumType::U60) => desugared::Expr::u60(range), Literal::NumType(kind_tree::NumType::U60) => desugared::Expr::u60(range),
Literal::NumType(kind_tree::NumType::U120) => desugared::Expr::u120(range), Literal::NumType(kind_tree::NumType::U120) => desugared::Expr::u120(range),
Literal::Number(kind_tree::Number::U60(num)) => desugared::Expr::num60(range, *num), Literal::Number(kind_tree::Number::U60(num)) => desugared::Expr::num60(range, *num),
Literal::Number(kind_tree::Number::U120(num)) => desugared::Expr::num120(range, *num),
Literal::String(string) => desugared::Expr::str(range, string.clone()),
Literal::Char(cht) => desugared::Expr::num60(range, *cht as u64), Literal::Char(cht) => desugared::Expr::num60(range, *cht as u64),
} }
} }
@ -138,9 +159,7 @@ impl<'a> DesugarState<'a> {
) -> Box<desugared::Expr> { ) -> Box<desugared::Expr> {
let sigma = QualifiedIdent::new_static("Sigma", None, range); let sigma = QualifiedIdent::new_static("Sigma", None, range);
let entry = self.old_book.entries.get(sigma.to_string().as_str()); if !self.check_implementation(sigma.to_str(), range, Sugar::Sigma) {
if entry.is_none() {
self.send_err(PassError::NeedToImplementMethods(range, Sugar::Sigma));
return desugared::Expr::err(range); return desugared::Expr::err(range);
} }
@ -221,10 +240,7 @@ impl<'a> DesugarState<'a> {
) -> Box<desugared::Expr> { ) -> Box<desugared::Expr> {
let sigma_new = QualifiedIdent::new_sugared("Sigma", "new", range); let sigma_new = QualifiedIdent::new_sugared("Sigma", "new", range);
let entry = self.old_book.entries.get(sigma_new.to_string().as_str()); if !self.check_implementation(sigma_new.to_str(), range, Sugar::Pair) {
if entry.is_none() {
self.send_err(PassError::NeedToImplementMethods(range, Sugar::Pair));
return desugared::Expr::err(range); return desugared::Expr::err(range);
} }

View File

@ -61,7 +61,7 @@ impl<'a> DesugarState<'a> {
fn gen_name(&mut self, range: Range) -> Ident { fn gen_name(&mut self, range: Range) -> Ident {
self.name_count += 1; self.name_count += 1;
Ident::new(format!("_x{}", self.name_count), range) Ident::new(format!("x_{}", self.name_count), range)
} }
fn gen_hole_expr(&mut self, range: Range) -> Box<desugared::Expr> { fn gen_hole_expr(&mut self, range: Range) -> Box<desugared::Expr> {

View File

@ -305,11 +305,6 @@ impl<'a> ErasureState<'a> {
name.to_string(), name.to_string(),
(name.range, (None, Relevance::Irrelevant)), (name.range, (None, Relevance::Irrelevant)),
); );
let span = expr.span.to_range().unwrap_or_else(|| name.range.clone());
if !self.unify(span, *on, (None, Relevance::Irrelevant), false) {
self.err_irrelevant(None, span, None)
}
} else { } else {
self.ctx.insert(name.to_string(), (name.range, *on)); self.ctx.insert(name.to_string(), (name.range, *on));
} }

View File

@ -8,6 +8,8 @@ pub enum Sugar {
Sigma, Sigma,
Pair, Pair,
BoolIf, BoolIf,
String,
U120,
Match(String), Match(String),
Open(String), Open(String),
} }
@ -217,6 +219,8 @@ impl Diagnostic for PassError {
Sugar::Sigma => "You must implement 'Sigma' in order to use the sigma notation.".to_string(), Sugar::Sigma => "You must implement 'Sigma' in order to use the sigma notation.".to_string(),
Sugar::Pair => "You must implement 'Sigma' and 'Sigma.new' in order to use the sigma notation.".to_string(), Sugar::Pair => "You must implement 'Sigma' and 'Sigma.new' in order to use the sigma notation.".to_string(),
Sugar::BoolIf => "You must implement 'Bool.if' in order to use the if notation.".to_string(), Sugar::BoolIf => "You must implement 'Bool.if' in order to use the if notation.".to_string(),
Sugar::String => "You must implement 'String.cons' in order to use the string notation.".to_string(),
Sugar::U120 => "You must implement 'U120.new' in order to use the u120 notation.".to_string(),
Sugar::Match(name) => format!("You must implement '{}.match' in order to use the match notation (or derive match with #derive[match]).", name), Sugar::Match(name) => format!("You must implement '{}.match' in order to use the match notation (or derive match with #derive[match]).", name),
Sugar::Open(name) => format!("You must implement '{}.open' in order to use the open notation (or derive open with #derive[open]).", name), Sugar::Open(name) => format!("You must implement '{}.open' in order to use the open notation (or derive open with #derive[open]).", name),
}], }],