add fancy printing
[lambda.git] / print.c
diff --git a/print.c b/print.c
index 33e7104..6a2cba5 100644 (file)
--- a/print.c
+++ b/print.c
@@ -11,29 +11,49 @@ void print_apos(unsigned int revision)
        }
 }
 
+void print_ident(char *ident, unsigned int revision)
+{
+       printf("%s", ident);
+       while(revision > 2){
+               putchar('\"');
+               revision -= 2;
+       }
+       if(revision == 1)
+               putchar('\'');
+}
+
 void term_print(struct lambda *t, struct lambda *mark)
 {
        if(t == mark)
                putchar('|');
        switch(t->which){
        case lambda_ident:
-               printf("%s", t->data.identifier.ident);
-               print_apos(t->data.identifier.revision);
+               print_ident(t->data.identifier.ident, t->data.identifier.revision);
                break;
        case lambda_abs:
-               printf("(λ");
-               printf("%s", t->data.abstraction.ident);
-               print_apos(t->data.abstraction.revision);
+               printf("λ");
+               print_ident(t->data.abstraction.ident, t->data.abstraction.revision);
+               while((t = t->data.abstraction.expr)->which == lambda_abs){
+                       putchar(' ');
+                       print_ident(t->data.abstraction.ident, t->data.abstraction.revision);
+               }
                putchar('.');
-               term_print(t->data.abstraction.expr, mark);
-               putchar(')');
+               term_print(t, mark);
                break;
        case lambda_app:
-               putchar('(');
+               if(t->data.application.expr1->which == lambda_abs)
+                       putchar('(');
                term_print(t->data.application.expr1, mark);
+               if(t->data.application.expr1->which == lambda_abs)
+                       putchar(')');
+
                putchar(' ');
+
+               if(t->data.application.expr2->which == lambda_app)
+                       putchar('(');
                term_print(t->data.application.expr2, mark);
-               putchar(')');
+               if(t->data.application.expr2->which == lambda_app)
+                       putchar(')');
                break;
        }
        if(t == mark)