summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNadrieril2019-12-24 22:08:22 +0000
committerNadrieril2019-12-24 22:08:22 +0000
commit12e7626c9fd8c1c1699bc0043b6524704dc6be82 (patch)
tree1b42c889c6143131cbe8b3c488afc11450efbdad
parentf5a588defc0ad22ce2f0d3b32ef8f0e22e43e672 (diff)
Ensure normalization respects var names on the nose
-rw-r--r--dhall/build.rs1
-rw-r--r--dhall/src/semantics/phase/normalize.rs16
-rw-r--r--dhall/src/tests.rs15
3 files changed, 14 insertions, 18 deletions
diff --git a/dhall/build.rs b/dhall/build.rs
index 9b00684..b88c71f 100644
--- a/dhall/build.rs
+++ b/dhall/build.rs
@@ -285,6 +285,7 @@ fn generate_tests() -> std::io::Result<()> {
// TODO: waiting for https://github.com/dhall-lang/dhall-lang/pull/871
|| path == "unit/MergeNone"
|| path == "unit/MergeSome"
+ || path == "unit/NaturalBuildFoldFusion"
}),
input_type: FileType::Text,
output_type: Some(FileType::Text),
diff --git a/dhall/src/semantics/phase/normalize.rs b/dhall/src/semantics/phase/normalize.rs
index 459eaf1..bf0c626 100644
--- a/dhall/src/semantics/phase/normalize.rs
+++ b/dhall/src/semantics/phase/normalize.rs
@@ -24,7 +24,7 @@ macro_rules! make_closure {
.into_value_with_type(make_closure!($($ty)*))
}};
// Warning: assumes that $ty, as a dhall value, has type `Type`
- (λ($var:ident : $($ty:tt)*) -> $($body:tt)*) => {{
+ (λ($var:tt : $($ty:tt)*) -> $($body:tt)*) => {{
let var: AlphaLabel = Label::from(stringify!($var)).into();
let ty = make_closure!($($ty)*);
let body = make_closure!($($body)*);
@@ -276,12 +276,12 @@ pub(crate) fn apply_builtin(
f.app(list_t.clone())
.app({
// Move `t` under new variables
- let t1 = t.under_binder(Label::from("x"));
- let t2 = t1.under_binder(Label::from("xs"));
+ let t1 = t.under_binder(Label::from("a"));
+ let t2 = t1.under_binder(Label::from("as"));
make_closure!(
- λ(x : #t) ->
- λ(xs : List #t1) ->
- [ var(x, 1, #t2) ] # var(xs, 0, List #t2)
+ λ(a : #t) ->
+ λ(as : List #t1) ->
+ [ var(a, 1, #t2) ] # var(as, 0, List #t2)
)
})
.app(EmptyListLit(t.clone()).into_value_with_type(list_t)),
@@ -303,8 +303,8 @@ pub(crate) fn apply_builtin(
Ret::Value(
f.app(optional_t.clone())
.app({
- let t1 = t.under_binder(Label::from("x"));
- make_closure!(λ(x: #t) -> Some(var(x, 0, #t1)))
+ let t1 = t.under_binder(Label::from("a"));
+ make_closure!(λ(a: #t) -> Some(var(a, 0, #t1)))
})
.app(
EmptyOptionalLit(t.clone())
diff --git a/dhall/src/tests.rs b/dhall/src/tests.rs
index 0163c4d..f1648cf 100644
--- a/dhall/src/tests.rs
+++ b/dhall/src/tests.rs
@@ -206,11 +206,9 @@ pub fn run_test(test: Test<'_>) -> Result<()> {
let expr = parse_file_str(&expr_file_path)?
.resolve()?
.typecheck()?
- .normalize();
- let expected = parse_file_str(&expected_file_path)?
- .resolve()?
- .typecheck()?
- .normalize();
+ .normalize()
+ .to_expr();
+ let expected = parse_file_str(&expected_file_path)?.to_expr();
assert_eq_display!(expr, expected);
}
@@ -220,12 +218,9 @@ pub fn run_test(test: Test<'_>) -> Result<()> {
.typecheck()?
.normalize()
.to_expr_alpha();
- let expected = parse_file_str(&expected_file_path)?
- .resolve()?
- .typecheck()?
- .normalize();
+ let expected = parse_file_str(&expected_file_path)?.to_expr();
- assert_eq_display!(expr, expected.to_expr());
+ assert_eq_display!(expr, expected);
}
}
Ok(())