struct lambda *r = make_lambda();
r->which = lambda_ident;
r->data.identifier.ident = strdup(i);
- r->data.identifier.revision = 0;
+ r->data.identifier.binding = NULL;
return r;
}
+void lambda_bind(struct lambda *tob, struct lambda *binding, char *ident)
+{
+ switch(tob->which){
+ case lambda_ident:
+ if(strcmp(ident, tob->data.identifier.ident) == 0 && tob->data.identifier.binding == NULL)
+ tob->data.identifier.binding = binding;
+ break;
+ case lambda_abs:
+ lambda_bind(tob->data.abstraction.expr, binding, ident);
+ break;
+ case lambda_app:
+ lambda_bind(tob->data.application.expr1, binding, ident);
+ lambda_bind(tob->data.application.expr2, binding, ident);
+ break;
+ }
+}
+
struct lambda *make_abstraction(char *i, bool strict, struct lambda *t)
{
struct lambda *r = make_lambda();
r->which = lambda_abs;
r->data.abstraction.ident = strdup(i);
- r->data.abstraction.revision = 0;
r->data.abstraction.strict = strict;
r->data.abstraction.expr = t;
+ lambda_bind(t, r, i);
return r;
}
int main()
{
+ setbuf(stdout, NULL);
int r = yyparse();
yylex_destroy();
return r;
:
| lambda SEMICOLON program
lambda
- : term
- {
- int maxdepth = 1000;
- printf(" ");
- lambda_reduce(&$1, &$1, &maxdepth);
- lambda_print($1, NULL);
- lambda_free($1);
- }
- | FUNC func
+ : FUNC func
{
decls_prepend($1->data.identifier.ident, $2);
printf("%s = ", $1->data.identifier.ident);
lambda_print($2, NULL);
+ putchar('\n');
lambda_free($1);
}
+ | term
+ {
+ struct lambda *t = $1;
+ printf(" ");
+ for(unsigned int i = 0; i<999; i++)
+ if(!lambda_reduce(&t, &t, true))
+ break;
+ lambda_print(t, NULL);
+ putchar('\n');
+ lambda_free(t);
+ }
func
: ASSIGN term
{ $$ = $2; }