#include "nodes.h" Node * alloc_node(NodeType type) { // TODO: Use a bump allocator? // TODO: Free memory! Node *node = malloc(sizeof(Node)); node->type = type; return node; } void print_node(Node *node) { switch (node->type) { case NODE_NUMBER: { if (node->number.negative) { printf("-"); } if (node->number.fractional != 0) { printf("%zu.%zu", node->number.integral, node->number.fractional); } else { printf("%zu", node->number.integral); } } break; case NODE_SYMBOL: case NODE_STRING: { sv_write(&node->string); } break; case NODE_BOOL: { if (node->boolean) { printf("true"); } else { printf("false"); } } break; case NODE_BUILTIN: { printf("({%s}", token_str[node->builtin.type]); size_t n_args = array_size(node->builtin.args); if (n_args != 0) { printf(" "); } for (size_t i = 0; i < n_args; ++i) { print_node(node->builtin.args[i]); if (i < n_args - 1) { printf(" "); } } printf(")"); } break; case NODE_DEF: { printf("(def "); print_node(node->def.symbol); printf(":"); sv_write(&node->def.type); printf(" "); print_node(node->def.value); printf(")"); } break; case NODE_SET: { printf("(set "); print_node(node->def.symbol); printf(" "); print_node(node->def.value); printf(")"); } break; default: { printf("{#unknown#}"); } break; } }