add strictness
[lambda.git] / print.c
diff --git a/print.c b/print.c
index 6a2cba5..c50d8dc 100644 (file)
--- a/print.c
+++ b/print.c
@@ -1,6 +1,14 @@
 #include <stdio.h>
 #include "lambda.h"
 
+#define PRINT_ABS(t) {\
+       if(t->data.abstraction.strict)\
+               putchar('!');\
+       printf("%s", t->data.abstraction.ident);\
+       print_apos(t->data.abstraction.revision);\
+       }
+
+
 void print_apos(unsigned int revision)
 {
        if(revision == 1)
@@ -11,31 +19,21 @@ 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:
-               print_ident(t->data.identifier.ident, t->data.identifier.revision);
+               printf("%s", t->data.identifier.ident);
+               print_apos(t->data.identifier.revision);
                break;
        case lambda_abs:
                printf("λ");
-               print_ident(t->data.abstraction.ident, t->data.abstraction.revision);
+               PRINT_ABS(t);
                while((t = t->data.abstraction.expr)->which == lambda_abs){
                        putchar(' ');
-                       print_ident(t->data.abstraction.ident, t->data.abstraction.revision);
+                       PRINT_ABS(t);
                }
                putchar('.');
                term_print(t, mark);
@@ -63,5 +61,5 @@ void term_print(struct lambda *t, struct lambda *mark)
 void lambda_print(struct lambda *t, struct lambda *mark)
 {
        term_print(t, mark);
-       putchar('\n');
+       printf(";\n");
 }