diff options
author | Nadrieril | 2019-03-16 23:21:51 +0100 |
---|---|---|
committer | Nadrieril | 2019-03-16 23:21:51 +0100 |
commit | 05454ab9936514409e1b3c97e36f3fb476d532ba (patch) | |
tree | 9ce983a7d76f861b22a6b8dabb68f34a80db15ac /dhall_generator | |
parent | 0f33caf4c1ee4d1f95d6ac3a41b5cf2f8efa7b54 (diff) |
Use Rc instead of Box in AST to allow structural sharing
Closes #29
Diffstat (limited to 'dhall_generator')
-rw-r--r-- | dhall_generator/src/lib.rs | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/dhall_generator/src/lib.rs b/dhall_generator/src/lib.rs index 1a74f4f..26be4c4 100644 --- a/dhall_generator/src/lib.rs +++ b/dhall_generator/src/lib.rs @@ -4,11 +4,12 @@ use dhall_core::*; use proc_macro2::TokenStream; use quote::quote; use std::collections::BTreeMap; +use std::rc::Rc; #[proc_macro] pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream { let input_str = input.to_string(); - let expr: Box<Expr<X, Import>> = parser::parse_expr(&input_str).unwrap(); + let expr: Rc<Expr<X, Import>> = parser::parse_expr(&input_str).unwrap(); let no_import = |_: &Import| -> X { panic!("Don't use import in dhall!()") }; let expr = expr.map_embed(&no_import); @@ -17,7 +18,7 @@ pub fn dhall_expr(input: proc_macro::TokenStream) -> proc_macro::TokenStream { } // Returns an expression of type Expr<_, _>. Expects input variables -// to be of type Box<Expr<_, _>> (future-proof for structural sharing). +// to be of type Rc<Expr<_, _>>. fn dhall_to_tokenstream( expr: &Expr<X, X>, ctx: &Context<Label, ()>, @@ -77,7 +78,7 @@ fn dhall_to_tokenstream( } } -// Returns an expression of type Box<Expr<_, _>> +// Returns an expression of type Rc<Expr<_, _>> fn dhall_to_tokenstream_bx( expr: &Expr<X, X>, ctx: &Context<Label, ()>, @@ -97,7 +98,7 @@ fn dhall_to_tokenstream_bx( // TODO: insert appropriate shifts ? let v: TokenStream = s.parse().unwrap(); quote! { { - let x: Box<Expr<_, _>> = #v.clone(); + let x: Rc<Expr<_, _>> = #v.clone(); x } } } @@ -125,7 +126,7 @@ fn label_to_tokenstream(l: &Label) -> TokenStream { } fn map_to_tokenstream( - m: &BTreeMap<Label, Box<Expr<X, X>>>, + m: &BTreeMap<Label, Rc<Expr<X, X>>>, ctx: &Context<Label, ()>, ) -> TokenStream { let (keys, values): (Vec<TokenStream>, Vec<TokenStream>) = m @@ -142,7 +143,7 @@ fn map_to_tokenstream( } fn option_to_tokenstream( - e: &Option<Box<Expr<X, X>>>, + e: &Option<Rc<Expr<X, X>>>, ctx: &Context<Label, ()>, ) -> TokenStream { let e = e.as_ref().map(|x| dhall_to_tokenstream_bx(x, ctx)); @@ -153,7 +154,7 @@ fn option_to_tokenstream( } fn vec_to_tokenstream( - e: &Vec<Box<Expr<X, X>>>, + e: &Vec<Rc<Expr<X, X>>>, ctx: &Context<Label, ()>, ) -> TokenStream { let e = e.iter().map(|x| dhall_to_tokenstream_bx(&**x, ctx)); |