ソースを参照

Created 't' as the universal source of truth

master
FelixBrendel 7年前
コミット
e923190e0b
7個のファイルの変更34行の追加21行の削除
  1. +0
    -2
      bin/pre.slime
  2. +9
    -0
      src/ast.c
  3. +6
    -6
      src/built_ins.c
  4. +6
    -6
      src/eval.c
  5. +3
    -1
      src/io.c
  6. +7
    -0
      src/parse.c
  7. +3
    -6
      src/testing.c

+ 0
- 2
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."


+ 9
- 0
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;


+ 6
- 6
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) {


+ 6
- 6
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 {


+ 3
- 1
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;


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



+ 3
- 6
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\")";


読み込み中…
キャンセル
保存