change eval order
[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 putchar('(');
31 term_print(t->data.application.expr1, mark);
32 if(t->data.application.expr1->which == lambda_abs)
33 printf(") (");
34 term_print(t->data.application.expr2, mark);
35 putchar(')');
36 break;
37 }
38 if(t == mark)
39 putchar('|');
40 }
41
42 void lambda_print(struct lambda *t, struct lambda *mark)
43 {
44 term_print(t, mark);
45 printf(";");
46 }