struct Ast_Node; typedef enum { Ast_Node_Type_Nil, Ast_Node_Type_Symbol, Ast_Node_Type_Keyword, Ast_Node_Type_Number, Ast_Node_Type_String, Ast_Node_Type_Pair, Ast_Node_Type_Function, Ast_Node_Type_Built_In_Function, } Ast_Node_Type; typedef struct { char* identifier; } Symbol; typedef struct { char* identifier; } Keyword; typedef struct { double value; } Number; typedef struct { char* value; } String; typedef struct { struct Ast_Node* first; struct Ast_Node* rest; } Pair; typedef struct { Pair* regular_params; Pair* keyword_params; } Lambda_List; typedef struct { Lambda_List* parameters; Pair* form; } Function; typedef struct { char* identifier; } Built_In_Function; struct Ast_Node { Ast_Node_Type type; union { Symbol* symbol; Keyword* keyword; Number* number; String* string; Pair* pair; Function* function; Built_In_Function* built_in_function; } value; }; // was forward declarated typedef struct Ast_Node Ast_Node; Ast_Node* create_ast_node_nil() { Ast_Node* node = new(Ast_Node); node->type = Ast_Node_Type_Nil; node->value.pair = NULL; return node; } Ast_Node* create_ast_node_number(double number) { Ast_Node* node = new(Ast_Node); node->type = Ast_Node_Type_Number; node->value.number = new(Number); node->value.number->value = number; return node; } Ast_Node* create_ast_node_string(char* str) { Ast_Node* node = new(Ast_Node); node->type = Ast_Node_Type_String; node->value.string = new(String); node->value.string->value = str; return node; } Ast_Node* create_ast_node_symbol(char* identifier) { Ast_Node* node = new(Ast_Node); node->type = Ast_Node_Type_Symbol; node->value.symbol = new(Symbol); node->value.symbol->identifier = identifier; return node; } Ast_Node* create_ast_node_built_in_function(char* identifier) { Ast_Node* node = new(Ast_Node); node->type = Ast_Node_Type_Built_In_Function; node->value.built_in_function = new(Built_In_Function); node->value.built_in_function->identifier = identifier; return node; } Ast_Node* create_ast_node_pair(Ast_Node* first, Ast_Node* rest) { Ast_Node* node = new(Ast_Node); node->type = Ast_Node_Type_Pair; node->value.pair = new(Pair); node->value.pair->first = first; node->value.pair->rest = rest; return node; }