#include <stdio.h>
#include "lambda.h"
-void print_apos(unsigned int revision)
-{
- if(revision == 1)
- printf("\'");
- if(revision > 2){
- printf("\"");
- print_apos(revision - 2);
+#define PRINT_ABS(t) {\
+ if(t->data.abstraction.strict)\
+ putchar('!');\
+ printf("%s", t->data.abstraction.ident);\
}
-}
+
void term_print(struct lambda *t, struct lambda *mark)
{
switch(t->which){
case lambda_ident:
printf("%s", t->data.identifier.ident);
- print_apos(t->data.identifier.revision);
break;
case lambda_abs:
- printf("(λ");
- printf("%s", t->data.abstraction.ident);
- print_apos(t->data.abstraction.revision);
+ printf("λ");
+ PRINT_ABS(t);
+ while((t = t->data.abstraction.expr)->which == lambda_abs){
+ putchar(' ');
+ PRINT_ABS(t);
+ }
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_abs)
+ putchar('(');
term_print(t->data.application.expr2, mark);
- putchar(')');
+ if(t->data.application.expr2->which == lambda_abs)
+ putchar(')');
break;
}
if(t == mark)