diff --git a/examples/ex1.rs b/examples/ex1.rs
index 5e525e58ada2aae02d2f869ae3d3a01c2156523f..e85065a0ceb187a023d3217b84d540cb55b48971 100644
--- a/examples/ex1.rs
+++ b/examples/ex1.rs
@@ -1,12 +1,14 @@
 #![feature(proc_macro)]
 
 extern crate parsetest;
-use parsetest::{app, mat};
-// use mat::traits::Matrix;
+use parsetest::mylit;
 
 fn main() {
     println!("here");
 
-    let v = app!(1);
+    let v = mylit!(99);
+    println!("v {}", v);
+
+    let v = mylit!(102);
     println!("v {}", v);
 }
diff --git a/src/lib.rs b/src/lib.rs
index a08ec23b422691d0b87d1895e9c04dd222a0553f..66d0fe2dc726cdff226334710a6c88572965487a 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -11,85 +11,31 @@ use syn::punctuated::Punctuated;
 use syn::spanned::Spanned;
 use syn::synom::Synom;
 use syn::{Expr, ExprArray, Ident, LitInt};
+use quote::ToTokens;
 
-struct Mat {
-    rows: Punctuated<ExprArray, Token![,]>,
-}
+use std::convert::From;
 
-struct App {
+/// MyLit
+struct MyLit {
     val: LitInt,
 }
 
-impl Synom for Mat {
+impl Synom for MyLit {
     named!(parse -> Self, do_parse!(
-        rows: call!(Punctuated::parse_terminated_nonempty) >> (Mat { rows })
+        val: call!(LitInt::parse) >> (MyLit { val })
     ));
 }
 
-/// A macro to construct matrices
 #[proc_macro]
-pub fn mat(input: TokenStream) -> TokenStream {
-    let mat: Mat = syn::parse(input).unwrap();
-
-    // check consistent number of columns
-    let nrows = mat.rows.len();
-    let ncols = mat.rows.iter().next().expect("BUG: zero rows").elems.len();
-
-    for row in mat.rows.iter() {
-        for (i, expr) in row.elems.iter().enumerate() {
-            if i >= ncols {
-                expr.span()
-                    .unstable()
-                    .error(format!("expected {} elements", ncols,))
-                    .emit();
-            }
-        }
+pub fn mylit(input: TokenStream) -> TokenStream {
+    let v: MyLit = syn::parse(input).unwrap();
+    let value: u32 = v.val.value() as u32;
+    if !(10 <= value && value < 100) {
+        v.val
+            .span()
+            .unstable()
+            .error(format!("expected literal 10 <= x < 100, got {}", value,))
+            .emit();
     }
-
-    let size = nrows * ncols;
-    let elems: Vec<&Expr> = mat.rows.iter().flat_map(|row| row.elems.iter()).collect();
-
-    let nrows_ty = Ident::from(format!("U{}", nrows));
-    let ncols_ty = Ident::from(format!("U{}", ncols));
-
-    quote!(unsafe {
-        extern crate mat;
-        mat::Mat::<_, [_; #size], mat::typenum::#nrows_ty, mat::typenum::#ncols_ty>::new([#(#elems,)*])
-    }).into()
-}
-
-impl Synom for App {
-    named!(parse -> Self, do_parse!(
-        val: call!(LitInt::parse) >> (App { val })
-    ));
-}
-
-/// A
-#[proc_macro]
-pub fn app(input: TokenStream) -> TokenStream {
-    let val: App = syn::parse(input).unwrap();
-
-    // // check consistent number of columns
-    // let nrows = mat.rows.len();
-    // let ncols = mat.rows.iter().next().expect("BUG: zero rows").elems.len();
-
-    // for row in mat.rows.iter() {
-    //     for (i, expr) in row.elems.iter().enumerate() {
-    //         if i >= ncols {
-    //             expr.span()
-    //                 .unstable()
-    //                 .error(format!("expected {} elements", ncols,))
-    //                 .emit();
-    //         }
-    //     }
-    // }
-
-    // let size = nrows * ncols;
-    // let elems: Vec<&Expr> = mat.rows.iter().flat_map(|row| row.elems.iter()).collect();
-
-    // let nrows_ty = Ident::from(format!("U{}", nrows));
-    // let ncols_ty = Ident::from(format!("U{}", ncols));
-    println!("val {:?}", val);
-
-    quote!().into()
+    From::from(v.val.into_tokens())
 }