change printing
[lambda.git] / print.c
1 #include <stdio.h>
2 #include "lambda.h"
3
4 #define PRINT_ABS(t) {\
5 if(t->data.abstraction.strict)\
6 putchar('!');\
7 printf("%s", t->data.abstraction.ident);\
8 }
9
10
11 void term_print(struct lambda *t, struct lambda *mark)
12 {
13 if(t == mark)
14 putchar('|');
15 switch(t->which){
16 case lambda_ident:
17 printf("%s", t->data.identifier.ident);
18 break;
19 case lambda_abs:
20 printf("λ");
21 PRINT_ABS(t);
22 while((t = t->data.abstraction.expr)->which == lambda_abs){
23 putchar(' ');
24 PRINT_ABS(t);
25 }
26 putchar('.');
27 term_print(t, mark);
28 break;
29 case lambda_app:
30 if(t->data.application.expr1->which == lambda_abs)
31 putchar('(');
32 term_print(t->data.application.expr1, mark);
33 if(t->data.application.expr1->which == lambda_abs)
34 putchar(')');
35
36 putchar(' ');
37
38 if(t->data.application.expr2->which == lambda_abs)
39 putchar('(');
40 term_print(t->data.application.expr2, mark);
41 if(t->data.application.expr2->which == lambda_abs)
42 putchar(')');
43 break;
44 }
45 if(t == mark)
46 putchar('|');
47 }
48
49 void lambda_print(struct lambda *t, struct lambda *mark)
50 {
51 term_print(t, mark);
52 putchar('\n');
53 }