#include "../runtime.h"

void f_add(struct stack* s) {
    struct node_num* left = (struct node_num*) eval(stack_peek(s, 0));
    struct node_num* right = (struct node_num*) eval(stack_peek(s, 1));
    stack_push(s, (struct node_base*) alloc_num(left->value + right->value));
}

void f_main(struct stack* s) {
    // PushInt 320
    stack_push(s, (struct node_base*) alloc_num(320));

    // PushInt 6
    stack_push(s, (struct node_base*) alloc_num(6));

    // PushGlobal f_add (the function for +)
    stack_push(s, (struct node_base*) alloc_global(f_add, 2));

    struct node_base* left;
    struct node_base* right;
    
    // MkApp
    left = stack_pop(s);
    right = stack_pop(s);
    stack_push(s, (struct node_base*) alloc_app(left, right));
    
    // MkApp
    left = stack_pop(s);
    right = stack_pop(s);
    stack_push(s, (struct node_base*) alloc_app(left, right));
}