Ast_Node* built_in_add(Ast_Node* operands) { double sum = 0; while (operands->type == Ast_Node_Type_Cons_Cell) { // TODO(Felix): assert type sum += operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; } return create_ast_node_number(sum); } Ast_Node* built_in_substract(Ast_Node* operands) { double diff = operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; while (operands->type == Ast_Node_Type_Cons_Cell) { // TODO(Felix): assert type diff -= operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; } return create_ast_node_number(diff); }