diff --git a/bin/pre.slime b/bin/pre.slime index 123fc21..3b8f203 100644 --- a/bin/pre.slime +++ b/bin/pre.slime @@ -1,5 +1,3 @@ -(define nil ()) - (define defmacro (macro (@name @params :rest @body) "Macro for creating macros with a more concise syntax." diff --git a/src/ast.c b/src/ast.c index 3a94e3d..db8a125 100644 --- a/src/ast.c +++ b/src/ast.c @@ -3,6 +3,7 @@ define_array_list(struct Ast_Node*, Ast_Node); typedef enum { Ast_Node_Type_Nil, + Ast_Node_Type_T, Ast_Node_Type_Symbol, Ast_Node_Type_Keyword, @@ -17,6 +18,7 @@ typedef enum { char* Ast_Node_Type_to_string(Ast_Node_Type type) { switch (type) { case(Ast_Node_Type_Nil): return "nil"; + case(Ast_Node_Type_T): return "t"; case(Ast_Node_Type_Number): return "number"; case(Ast_Node_Type_String): return "string"; case(Ast_Node_Type_Symbol): return "symbol"; @@ -233,6 +235,13 @@ Ast_Node* create_ast_node_nil() { return node; } +Ast_Node* create_ast_node_t() { + Ast_Node* node = new(Ast_Node); + node->type = Ast_Node_Type_T; + node->value.pair = nullptr; + return node; +} + Ast_Node* create_ast_node_number(double number) { Ast_Node* node = new(Ast_Node); node->type = Ast_Node_Type_Number; diff --git a/src/built_ins.c b/src/built_ins.c index 751db15..c9fa399 100644 --- a/src/built_ins.c +++ b/src/built_ins.c @@ -43,7 +43,7 @@ bool ast_node_equal(Ast_Node* n1, Ast_Node* n2) { Ast_Node* built_in_equals(Ast_Node* operands) { if (operands->type == Ast_Node_Type_Nil) - return create_ast_node_number(1); + return create_ast_node_t(); Ast_Node* first = operands->value.pair->first; @@ -53,7 +53,7 @@ Ast_Node* built_in_equals(Ast_Node* operands) { operands = operands->value.pair->rest; } - return create_ast_node_number(1); + return create_ast_node_t(); } Ast_Node* built_in_greater(Ast_Node* operands) { @@ -71,7 +71,7 @@ Ast_Node* built_in_greater(Ast_Node* operands) { operands = operands->value.pair->rest; } - return create_ast_node_number(1); + return create_ast_node_t(); } Ast_Node* built_in_greater_equal(Ast_Node* operands) { @@ -89,7 +89,7 @@ Ast_Node* built_in_greater_equal(Ast_Node* operands) { operands = operands->value.pair->rest; } - return create_ast_node_number(1); + return create_ast_node_t(); } Ast_Node* built_in_less(Ast_Node* operands) { @@ -107,7 +107,7 @@ Ast_Node* built_in_less(Ast_Node* operands) { operands = operands->value.pair->rest; } - return create_ast_node_number(1); + return create_ast_node_t(); } Ast_Node* built_in_less_equal(Ast_Node* operands) { @@ -125,7 +125,7 @@ Ast_Node* built_in_less_equal(Ast_Node* operands) { operands = operands->value.pair->rest; } - return create_ast_node_number(1); + return create_ast_node_t(); } Ast_Node* built_in_add(Ast_Node* operands) { diff --git a/src/eval.c b/src/eval.c index 081b4f6..48be4ce 100644 --- a/src/eval.c +++ b/src/eval.c @@ -371,9 +371,9 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { Ast_Node* ret = new(Ast_Node); switch (node->type) { + case Ast_Node_Type_T: case Ast_Node_Type_Nil: - ret->type = Ast_Node_Type_Nil; - return ret; + return node; case Ast_Node_Type_Symbol: { Ast_Node* symbol; try { @@ -478,7 +478,7 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { } else if (bindings->type != Ast_Node_Type_Pair) { report_error(Error_Type_Ill_Formed_Arguments); } - + Ast_Node* sym = bindings->value.pair->first->value.pair->first; if(sym->type != Ast_Node_Type_Symbol) { report_error(Error_Type_Ill_Formed_Arguments); @@ -533,7 +533,7 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { if (!result) return create_ast_node_nil(); } - return create_ast_node_number(1); + return create_ast_node_t(); } case Built_In_Or: { bool result = false; @@ -546,7 +546,7 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { } arguments = arguments->value.pair->rest; - if (result) return create_ast_node_number(1); + if (result) return create_ast_node_t(); } return create_ast_node_nil(); @@ -564,7 +564,7 @@ Ast_Node* eval_expr(Ast_Node* node, Environment* env) { } if (truthy) return create_ast_node_nil(); - return create_ast_node_number(1); + return create_ast_node_t(); } case Built_In_If: { try { diff --git a/src/io.c b/src/io.c index 408a029..48d26ad 100644 --- a/src/io.c +++ b/src/io.c @@ -29,7 +29,6 @@ void log_message(Log_Level type, char* message) { printf("%s: %s\n",prefix, message); } - void panic(char* message) { log_message(Log_Level_Critical, message); exit(1); @@ -40,6 +39,9 @@ void print(Ast_Node* node) { case (Ast_Node_Type_Nil): { printf("nil"); } break; + case (Ast_Node_Type_T): { + printf("t"); + } break; case (Ast_Node_Type_Number): { printf("%f", node->value.number->value); } break; diff --git a/src/parse.c b/src/parse.c index 5867227..96aab99 100644 --- a/src/parse.c +++ b/src/parse.c @@ -101,6 +101,13 @@ Ast_Node* parse_keyword(char* text, int* index_in_text) { Ast_Node* parse_symbol(char* text, int* index_in_text) { // we are now at the first char of the symbol char* str_symbol = read_atom(text, index_in_text); + + if (string_equal(str_symbol, "nil")) { + return create_ast_node_nil(); + } + if (string_equal(str_symbol, "t")) { + return create_ast_node_t(); + } return create_ast_node_symbol(str_symbol); } diff --git a/src/testing.c b/src/testing.c index 87164c2..6588783 100644 --- a/src/testing.c +++ b/src/testing.c @@ -314,8 +314,7 @@ testresult test_built_in_and() { assert_no_error(error); assert_not_null(result); - assert_equal_type(result, Ast_Node_Type_Number); - assert_equal_double(result->value.number->value, 1); + assert_equal_type(result, Ast_Node_Type_T); // a false case char exp_string2[] = "(and () \"asd\" 4)"; @@ -336,8 +335,7 @@ testresult test_built_in_or() { assert_no_error(error); assert_not_null(result); - assert_equal_type(result, Ast_Node_Type_Number); - assert_equal_double(result->value.number->value, 1); + assert_equal_type(result, Ast_Node_Type_T); // a false case char exp_string2[] = "(or () ())"; @@ -360,8 +358,7 @@ testresult test_built_in_not() { // a true case assert_no_error(error); assert_not_null(result); - assert_equal_type(result, Ast_Node_Type_Number); - assert_equal_double(result->value.number->value, 1); + assert_equal_type(result, Ast_Node_Type_T); // a false case char exp_string2[] = "(not \"asd xD\")";