|
- 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);
- }
|