Ast_Node* built_in_add(Ast_Node* operands) { double sum = 0; while (operands->type == Ast_Node_Type_Pair) { assert_type(operands->value.pair->first, Ast_Node_Type_Number); sum += operands->value.pair->first->value.number->value; operands = operands->value.pair->rest; } return create_ast_node_number(sum); } Ast_Node* built_in_substract(Ast_Node* operands) { assert_type(operands->value.pair->first, Ast_Node_Type_Number); double difference = operands->value.pair->first->value.number->value; operands = operands->value.pair->rest; while (operands->type == Ast_Node_Type_Pair) { assert_type(operands->value.pair->first, Ast_Node_Type_Number); difference -= operands->value.pair->first->value.number->value; operands = operands->value.pair->rest; } return create_ast_node_number(difference); } Ast_Node* built_in_multiply(Ast_Node* operands) { assert_type(operands->value.pair->first, Ast_Node_Type_Number); double product = operands->value.pair->first->value.number->value; operands = operands->value.pair->rest; while (operands->type == Ast_Node_Type_Pair) { assert_type(operands->value.pair->first, Ast_Node_Type_Number); product *= operands->value.pair->first->value.number->value; operands = operands->value.pair->rest; } return create_ast_node_number(product); } Ast_Node* built_in_divide(Ast_Node* operands) { assert_type(operands->value.pair->first, Ast_Node_Type_Number); double quotient = operands->value.pair->first->value.number->value; operands = operands->value.pair->rest; while (operands->type == Ast_Node_Type_Pair) { assert_type(operands->value.pair->first, Ast_Node_Type_Number); quotient /= operands->value.pair->first->value.number->value; operands = operands->value.pair->rest; } return create_ast_node_number(quotient); }