Change to raw string

This commit is contained in:
Nathan Braswell
2020-04-19 01:25:20 -04:00
parent 50817b567f
commit dff7306cc3

View File

@@ -1398,83 +1398,83 @@ fun main(argc: int, argv: **char): int {
match (get_value(main)) {
MalValue::Function(f) {
var top_decs = str("#include <stdlib.h>\n#include <stdio.h>\n#include <stddef.h>\n")
top_decs += "void error(char* message) {fprintf(stderr, \"%s\", message); exit(1);}\n"
top_decs += "void check_num_params(size_t a, size_t b, char* function) { if (a!=b) {fprintf(stderr, \"%s: expected num params to be %d\\n\", function, b); exit(1);}}\n"
top_decs += "void check_int(size_t p, char* function) { if ((p&0x7)!=0) {fprintf(stderr, \"%s: expected param to be int\\n\", function); exit(1);}}\n"
top_decs += "void check_function(size_t p, char* message) { if ((p&0x7)!=0x6) {fprintf(stderr, \"%s: expected a function\\n\", message); exit(1);}}\n"
top_decs += "typedef struct {\n"
top_decs += "size_t (*func)(size_t*,size_t,size_t*);\n"
top_decs += "size_t* data;\n"
top_decs += "} closure;\n"
top_decs += "size_t _plus_impl(size_t* _, size_t num, size_t* args) {\n"
top_decs += "check_num_params(num, 2, \"+\"); check_int(args[0], \"+\"); check_int(args[1], \"+\");"
top_decs += " return (size_t)(((((ptrdiff_t)args[0]) >> 3) + (((ptrdiff_t)args[1]) >> 3)) << 3);\n"
top_decs += "}\n"
top_decs += """void error(char* message) {fprintf(stderr, "%s", message); exit(1);}
void check_num_params(size_t a, size_t b, char* function) { if (a!=b) {fprintf(stderr, "%s: expected num params to be %d\n", function, b); exit(1);}}
void check_int(size_t p, char* function) { if ((p&0x7)!=0) {fprintf(stderr, "%s: expected param to be int\n", function); exit(1);}}
void check_function(size_t p, char* message) { if ((p&0x7)!=0x6) {fprintf(stderr, "%s: expected a function\n", message); exit(1);}}
typedef struct {
size_t (*func)(size_t*,size_t,size_t*);
size_t* data;
} closure;
size_t _plus_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, "+"); check_int(args[0], "+"); check_int(args[1], "+");
return (size_t)(((((ptrdiff_t)args[0]) >> 3) + (((ptrdiff_t)args[1]) >> 3)) << 3);
}"""
var top_defs = str("closure _plus_closure = { _plus_impl, NULL};\n")
top_defs += "size_t _minus_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \"-\"); check_int(args[0], \"-\"); check_int(args[1], \"-\");"
top_defs += " return (size_t)(((((ptrdiff_t)args[0]) >> 3) - (((ptrdiff_t)args[1]) >> 3)) << 3);\n"
top_defs += "}\n"
top_defs += "closure _minus_closure =(closure){ _minus_impl, NULL};\n"
top_defs += "size_t _mult_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \"*\"); check_int(args[0], \"*\"); check_int(args[1], \"*\");"
top_defs += " return (size_t)(((((ptrdiff_t)args[0]) >> 3) * (((ptrdiff_t)args[1]) >> 3)) << 3);\n"
top_defs += "}\n"
top_defs += "closure _mult_closure = (closure){ _mult_impl, NULL};\n"
top_defs += "size_t _div_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \"/\"); check_int(args[0], \"/\"); check_int(args[1], \"/\");"
top_defs += " return (size_t)(((((ptrdiff_t)args[0]) >> 3) / (((ptrdiff_t)args[1]) >> 3)) << 3);\n"
top_defs += "}\n"
top_defs += "closure _div_closure = (closure){ _div_impl, NULL};\n"
top_defs += "size_t _eq_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \"=\");"
top_defs += "if (args[0] == args[1]) { return 0x9F; } else { return 0x1F; }\n"
top_defs += "}\n"
top_defs += "closure _eq_closure = (closure){ _eq_impl, NULL};\n"
top_defs += "size_t _lt_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \"<\"); check_int(args[0], \"<\"); check_int(args[1], \"<\");"
top_defs += "if (args[0] < args[1]) { return 0x9F; } else { return 0x1F; }\n"
top_defs += "}\n"
top_defs += "closure _lt_closure = (closure){ _lt_impl, NULL};\n"
top_defs += "size_t _lte_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \"<=\"); check_int(args[0], \"<=\"); check_int(args[1], \"<=\");"
top_defs += "if (args[0] <= args[1]) { return 0x9F; } else { return 0x1F; }\n"
top_defs += "}\n"
top_defs += "closure _lte_closure = (closure){ _lte_impl, NULL};\n"
top_defs += "size_t _gt_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \">\"); check_int(args[0], \">\"); check_int(args[1], \">\");"
top_defs += "if (args[0] > args[1]) { return 0x9F; } else { return 0x1F; }\n"
top_defs += "}\n"
top_defs += "closure _gt_closure = (closure){ _gt_impl, NULL};\n"
top_defs += "size_t _gte_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "check_num_params(num, 2, \">=\"); check_int(args[0], \">=\"); check_int(args[1], \">=\");"
top_defs += "if (args[0] >= args[1]) { return 0x9F; } else { return 0x1F; }\n"
top_defs += "}\n"
top_defs += "closure _gte_closure = (closure){ _gte_impl, NULL};\n"
top_defs += "size_t _print_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "for (int _idx = 0; _idx < num; _idx++) {\n"
top_defs += "if ((args[_idx] & 0xFF) == 0x2F) printf(\"nil\");\n"
top_defs += "else if ((args[_idx] & 0xFF) == 0x9F) printf(\"true\");\n"
top_defs += "else if ((args[_idx] & 0xFF) == 0x1F) printf(\"false\");\n"
top_defs += "else if ((args[_idx] & 0xFF) == 0x0F) printf(\"Char?\");\n"
top_defs += "else if ((args[_idx] & 0x07) == 0x06) printf(\"function\");\n"
top_defs += "else if ((args[_idx] & 0x07) == 0x05) printf(\"Symbol?\");\n"
top_defs += "else if ((args[_idx] & 0x07) == 0x04) printf(\"Atom?\");\n"
top_defs += "else if ((args[_idx] & 0x07) == 0x03) printf(\"String?\");\n"
top_defs += "else if ((args[_idx] & 0x07) == 0x02) printf(\"Vector?\");\n"
top_defs += "else if ((args[_idx] & 0x07) == 0x01) printf(\"List?\");\n"
top_defs += "else if ((args[_idx] & 0x07) == 0x00) printf(\"%d\", args[_idx]>>3);\n"
top_defs += "else printf(\"can't print\");\n" //'
top_defs += "}\n"
top_defs += "return 0x2F;\n"
top_defs += "}\n"
top_defs += "closure _print_closure = (closure){ _print_impl, NULL};\n"
top_defs += "size_t _println_impl(size_t* _, size_t num, size_t* args) {\n"
top_defs += "_print_impl(_, num, args);\n"
top_defs += "printf(\"\\n\");\n"
top_defs += "return 0x2F;\n"
top_defs += "}\n"
top_defs += "closure _println_closure = (closure){ _println_impl, NULL};\n"
top_defs += """size_t _minus_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, "-"); check_int(args[0], "-"); check_int(args[1], "-");
return (size_t)(((((ptrdiff_t)args[0]) >> 3) - (((ptrdiff_t)args[1]) >> 3)) << 3);
}
closure _minus_closure =(closure){ _minus_impl, NULL};
size_t _mult_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, "*"); check_int(args[0], "*"); check_int(args[1], "*");
return (size_t)(((((ptrdiff_t)args[0]) >> 3) * (((ptrdiff_t)args[1]) >> 3)) << 3);
}
closure _mult_closure = (closure){ _mult_impl, NULL};
size_t _div_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, "/"); check_int(args[0], "/"); check_int(args[1], "/");
return (size_t)(((((ptrdiff_t)args[0]) >> 3) / (((ptrdiff_t)args[1]) >> 3)) << 3);
}
closure _div_closure = (closure){ _div_impl, NULL};
size_t _eq_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, "=");
if (args[0] == args[1]) { return 0x9F; } else { return 0x1F; }
}
closure _eq_closure = (closure){ _eq_impl, NULL};
size_t _lt_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, "<"); check_int(args[0], "<"); check_int(args[1], "<");
if (args[0] < args[1]) { return 0x9F; } else { return 0x1F; }
}
closure _lt_closure = (closure){ _lt_impl, NULL};
size_t _lte_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, "<="); check_int(args[0], "<="); check_int(args[1], "<=");
if (args[0] <= args[1]) { return 0x9F; } else { return 0x1F; }
}
closure _lte_closure = (closure){ _lte_impl, NULL};
size_t _gt_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, ">"); check_int(args[0], ">"); check_int(args[1], ">");
if (args[0] > args[1]) { return 0x9F; } else { return 0x1F; }
}
closure _gt_closure = (closure){ _gt_impl, NULL};
size_t _gte_impl(size_t* _, size_t num, size_t* args) {
check_num_params(num, 2, ">="); check_int(args[0], ">="); check_int(args[1], ">=");
if (args[0] >= args[1]) { return 0x9F; } else { return 0x1F; }
}
closure _gte_closure = (closure){ _gte_impl, NULL};
size_t _print_impl(size_t* _, size_t num, size_t* args) {
for (int _idx = 0; _idx < num; _idx++) {
if ((args[_idx] & 0xFF) == 0x2F) printf("nil");
else if ((args[_idx] & 0xFF) == 0x9F) printf("true");
else if ((args[_idx] & 0xFF) == 0x1F) printf("false");
else if ((args[_idx] & 0xFF) == 0x0F) printf("Char?");
else if ((args[_idx] & 0x07) == 0x06) printf("function");
else if ((args[_idx] & 0x07) == 0x05) printf("Symbol?");
else if ((args[_idx] & 0x07) == 0x04) printf("Atom?");
else if ((args[_idx] & 0x07) == 0x03) printf("String?");
else if ((args[_idx] & 0x07) == 0x02) printf("Vector?");
else if ((args[_idx] & 0x07) == 0x01) printf("List?");
else if ((args[_idx] & 0x07) == 0x00) printf("%d", args[_idx]>>3);
else printf("can't print");
}
return 0x2F;
}
closure _print_closure = (closure){ _print_impl, NULL};
size_t _println_impl(size_t* _, size_t num, size_t* args) {
_print_impl(_, num, args);
printf("\n");
return 0x2F;
}
closure _println_closure = (closure){ _println_impl, NULL};""" //'
var main_s = str("int main(int argc, char** argv) {\n")
var main_body = str()
var inner_main = compile(&top_decs, &top_defs, &main_s, &main_body, f.env, *f.body)