Ast_Node* built_in_add(Ast_Node* operands) { double sum = 0; while (operands->type == Ast_Node_Type_Cons_Cell) { assert_type(operands->value.cons_cell->first, Ast_Node_Type_Number); 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) { assert_type(operands->value.cons_cell->first, Ast_Node_Type_Number); double difference = operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; while (operands->type == Ast_Node_Type_Cons_Cell) { assert_type(operands->value.cons_cell->first, Ast_Node_Type_Number); difference -= operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; } return create_ast_node_number(difference); } Ast_Node* built_in_multiply(Ast_Node* operands) { assert_type(operands->value.cons_cell->first, Ast_Node_Type_Number); double product = operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; while (operands->type == Ast_Node_Type_Cons_Cell) { assert_type(operands->value.cons_cell->first, Ast_Node_Type_Number); product *= operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; } return create_ast_node_number(product); } Ast_Node* built_in_divide(Ast_Node* operands) { assert_type(operands->value.cons_cell->first, Ast_Node_Type_Number); double quotient = operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; while (operands->type == Ast_Node_Type_Cons_Cell) { assert_type(operands->value.cons_cell->first, Ast_Node_Type_Number); quotient /= operands->value.cons_cell->first->value.number->value; operands = operands->value.cons_cell->rest; } return create_ast_node_number(quotient); }