diff options
Diffstat (limited to 'dhall/src')
-rw-r--r-- | dhall/src/semantics/core/context.rs | 12 | ||||
-rw-r--r-- | dhall/src/semantics/core/value.rs | 26 | ||||
-rw-r--r-- | dhall/src/semantics/core/var.rs | 21 | ||||
-rw-r--r-- | dhall/src/semantics/phase/normalize.rs | 9 | ||||
-rw-r--r-- | dhall/src/semantics/phase/typecheck.rs | 22 |
5 files changed, 34 insertions, 56 deletions
diff --git a/dhall/src/semantics/core/context.rs b/dhall/src/semantics/core/context.rs index 47d2d2d..8c64c26 100644 --- a/dhall/src/semantics/core/context.rs +++ b/dhall/src/semantics/core/context.rs @@ -6,7 +6,9 @@ use crate::syntax::{Label, V}; #[derive(Debug, Clone)] enum CtxItem { - Kept(AlphaVar, Value), + // Variable is bound with given type + Kept(Value), + // Variable has been replaced by corresponding value Replaced(Value), } @@ -24,7 +26,7 @@ impl TyCtx { } pub fn insert_type(&self, x: &Binder, t: Value) -> Self { let mut vec = self.ctx.clone(); - vec.push((x.clone(), CtxItem::Kept(x.into(), t.under_binder(x)))); + vec.push((x.clone(), CtxItem::Kept(t.under_binder()))); self.with_vec(vec) } pub fn insert_value( @@ -47,7 +49,7 @@ impl TyCtx { Some(newvar) => newvar, None => break item, }; - if let CtxItem::Kept(_, _) = item { + if let CtxItem::Kept(_) = item { shift_delta += 1; } } else { @@ -57,8 +59,8 @@ impl TyCtx { }; let v = match found_item { - CtxItem::Kept(newvar, t) => Value::from_kind_and_type( - ValueKind::Var(newvar.clone()), + CtxItem::Kept(t) => Value::from_kind_and_type( + ValueKind::Var(AlphaVar::default()), t.clone(), ), CtxItem::Replaced(v) => v.clone(), diff --git a/dhall/src/semantics/core/value.rs b/dhall/src/semantics/core/value.rs index 6ae0a90..8b3ada1 100644 --- a/dhall/src/semantics/core/value.rs +++ b/dhall/src/semantics/core/value.rs @@ -209,9 +209,9 @@ impl Value { pub(crate) fn app(&self, v: Value) -> Value { let body_t = match &*self.get_type_not_sort().as_whnf() { - ValueKind::Pi(x, t, e) => { + ValueKind::Pi(_, t, e) => { v.check_type(t); - e.subst_shift(&x.into(), &v) + e.subst_shift(&AlphaVar::default(), &v) } _ => unreachable!("Internal type error"), }; @@ -242,18 +242,12 @@ impl Value { pub(crate) fn shift(&self, delta: isize, var: &AlphaVar) -> Option<Self> { Some(self.as_internal().shift(delta, var)?.into_value()) } - pub(crate) fn over_binder<T>(&self, x: T) -> Option<Self> - where - T: Into<AlphaVar>, - { - self.shift(-1, &x.into()) + pub(crate) fn over_binder(&self) -> Option<Self> { + self.shift(-1, &AlphaVar::default()) } - pub(crate) fn under_binder<T>(&self, x: T) -> Self - where - T: Into<AlphaVar>, - { + pub(crate) fn under_binder(&self) -> Self { // Can't fail since delta is positive - self.shift(1, &x.into()).unwrap() + self.shift(1, &AlphaVar::default()).unwrap() } pub(crate) fn subst_shift(&self, var: &AlphaVar, val: &Value) -> Self { match &*self.as_kind() { @@ -456,18 +450,18 @@ impl ValueKind<Value> { ValueKind::Var(v) => ValueKind::Var(v.shift(delta, var)?), _ => self.traverse_ref_with_special_handling_of_binders( |x| Ok(x.shift(delta, var)?), - |b, _, x| Ok(x.shift(delta, &var.under_binder(b))?), + |_, _, x| Ok(x.shift(delta, &var.under_binder())?), )?, }) } fn subst_shift(&self, var: &AlphaVar, val: &Value) -> Self { match self { ValueKind::Var(v) if v == var => val.to_whnf_ignore_type(), - ValueKind::Var(v) => ValueKind::Var(v.over_binder(var).unwrap()), + ValueKind::Var(v) => ValueKind::Var(v.shift(-1, var).unwrap()), _ => self.map_ref_with_special_handling_of_binders( |x| x.subst_shift(var, val), - |b, _, x| { - x.subst_shift(&var.under_binder(b), &val.under_binder(b)) + |_, _, x| { + x.subst_shift(&var.under_binder(), &val.under_binder()) }, ), } diff --git a/dhall/src/semantics/core/var.rs b/dhall/src/semantics/core/var.rs index 93776bf..b336c66 100644 --- a/dhall/src/semantics/core/var.rs +++ b/dhall/src/semantics/core/var.rs @@ -26,15 +26,9 @@ impl AlphaVar { alpha: self.alpha.shift(delta, &var.alpha)?, }) } - pub(crate) fn under_binder<T>(&self, x: T) -> Self - where - T: Into<AlphaVar>, - { + pub(crate) fn under_binder(&self) -> Self { // Can't fail since delta is positive - self.shift(1, &x.into()).unwrap() - } - pub(crate) fn over_binder(&self, x: &AlphaVar) -> Option<Self> { - self.shift(-1, x) + self.shift(1, &AlphaVar::default()).unwrap() } } @@ -82,17 +76,6 @@ impl std::fmt::Debug for Binder { } } -impl From<Binder> for AlphaVar { - fn from(x: Binder) -> AlphaVar { - AlphaVar { alpha: V((), 0) } - } -} -impl<'a> From<&'a Binder> for AlphaVar { - fn from(x: &'a Binder) -> AlphaVar { - AlphaVar { alpha: V((), 0) } - } -} - impl From<Binder> for Label { fn from(x: Binder) -> Label { x.name diff --git a/dhall/src/semantics/phase/normalize.rs b/dhall/src/semantics/phase/normalize.rs index 8f9a58a..541a196 100644 --- a/dhall/src/semantics/phase/normalize.rs +++ b/dhall/src/semantics/phase/normalize.rs @@ -1,10 +1,9 @@ use std::collections::HashMap; use std::convert::TryInto; -use crate::semantics::core::value::Value; -use crate::semantics::core::value::ValueKind; use crate::semantics::phase::typecheck::{rc, typecheck}; use crate::semantics::phase::Normalized; +use crate::semantics::{AlphaVar, Value, ValueKind}; use crate::syntax; use crate::syntax::Const::Type; use crate::syntax::{ @@ -367,9 +366,9 @@ pub(crate) fn apply_builtin( pub(crate) fn apply_any(f: Value, a: Value, ty: &Value) -> ValueKind<Value> { let f_borrow = f.as_whnf(); match &*f_borrow { - ValueKind::Lam(x, _, e) => { - e.subst_shift(&x.into(), &a).to_whnf_check_type(ty) - } + ValueKind::Lam(_, _, e) => e + .subst_shift(&AlphaVar::default(), &a) + .to_whnf_check_type(ty), ValueKind::AppliedBuiltin(b, args) => { use std::iter::once; let args = args.iter().cloned().chain(once(a.clone())).collect(); diff --git a/dhall/src/semantics/phase/typecheck.rs b/dhall/src/semantics/phase/typecheck.rs index 852f41b..15025c1 100644 --- a/dhall/src/semantics/phase/typecheck.rs +++ b/dhall/src/semantics/phase/typecheck.rs @@ -6,7 +6,7 @@ use crate::error::{TypeError, TypeMessage}; use crate::semantics::core::context::TyCtx; use crate::semantics::phase::normalize::merge_maps; use crate::semantics::phase::Normalized; -use crate::semantics::{Binder, Value, ValueKind}; +use crate::semantics::{AlphaVar, Binder, Value, ValueKind}; use crate::syntax; use crate::syntax::{ Builtin, Const, Expr, ExprKind, InterpolatedTextContents, Label, Span, @@ -385,15 +385,15 @@ fn type_last_layer( App(f, a) => { let tf = f.get_type()?; let tf_borrow = tf.as_whnf(); - let (x, tx, tb) = match &*tf_borrow { - ValueKind::Pi(x, tx, tb) => (x, tx, tb), + let (tx, tb) = match &*tf_borrow { + ValueKind::Pi(_, tx, tb) => (tx, tb), _ => return mkerr(NotAFunction(f.clone())), }; if &a.get_type()? != tx { return mkerr(TypeMismatch(f.clone(), tx.clone(), a.clone())); } - let ret = tb.subst_shift(&x.into(), a); + let ret = tb.subst_shift(&AlphaVar::default(), a); ret.normalize_nf(); RetTypeOnly(ret) } @@ -500,13 +500,12 @@ fn type_last_layer( ValueKind::UnionType(kts) => match kts.get(&x) { // Constructor has type T -> < x: T, ... > Some(Some(t)) => { - let x = ctx.new_binder(x); RetTypeOnly( tck_pi_type( ctx, - x.clone(), + ctx.new_binder(x), t.clone(), - r.under_binder(x), + r.under_binder(), )? ) }, @@ -719,8 +718,8 @@ fn type_last_layer( // Union alternative with type Some(Some(variant_type)) => { let handler_type_borrow = handler_type.as_whnf(); - let (x, tx, tb) = match &*handler_type_borrow { - ValueKind::Pi(x, tx, tb) => (x, tx, tb), + let (tx, tb) = match &*handler_type_borrow { + ValueKind::Pi(_, tx, tb) => (tx, tb), _ => { return mkerr(NotAFunction( handler_type.clone(), @@ -736,8 +735,9 @@ fn type_last_layer( )); } - // Extract `tb` from under the `x` binder. Fails is `x` was free in `tb`. - match tb.over_binder(x) { + // Extract `tb` from under the binder. Fails if the variable was used + // in `tb`. + match tb.over_binder() { Some(x) => x, None => return mkerr( MergeHandlerReturnTypeMustNotBeDependent, |