From a3f74cdaec717adff6b6c9da21b4d9d74b0f20ab Mon Sep 17 00:00:00 2001 From: Felix Brendel Date: Sat, 4 May 2019 00:30:17 +0200 Subject: [PATCH] started on svg visualization --- bin/tests/import.slime | 1 + bin/tests/import_and_load.slime | 3 ++ bin/visualization.svg | 14 +++++++ build.sh | 1 + src/defines.cpp | 4 +- src/error.cpp | 2 +- src/forward_decls.cpp | 2 + src/slime.h | 1 + src/testing.cpp | 12 +++--- src/visualization.cpp | 65 +++++++++++++++++++++++++++++++++ 10 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 bin/tests/import.slime create mode 100644 bin/tests/import_and_load.slime create mode 100644 bin/visualization.svg create mode 100644 src/visualization.cpp diff --git a/bin/tests/import.slime b/bin/tests/import.slime new file mode 100644 index 0000000..c5bc9a2 --- /dev/null +++ b/bin/tests/import.slime @@ -0,0 +1 @@ +(define variable "Hello World!") \ No newline at end of file diff --git a/bin/tests/import_and_load.slime b/bin/tests/import_and_load.slime new file mode 100644 index 0000000..c245c7b --- /dev/null +++ b/bin/tests/import_and_load.slime @@ -0,0 +1,3 @@ +(import "tests/import.slime") + +(print variable) diff --git a/bin/visualization.svg b/bin/visualization.svg new file mode 100644 index 0000000..d991630 --- /dev/null +++ b/bin/visualization.svg @@ -0,0 +1,14 @@ + + + + + doeun + + + ASDNew texhgfdgdhft + + + + \ No newline at end of file diff --git a/build.sh b/build.sh index 6f5a012..641da8e 100755 --- a/build.sh +++ b/build.sh @@ -2,6 +2,7 @@ TIMEFORMAT=%3lR SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" pushd $SCRIPTPATH > /dev/null +# _DEBUG time clang++ src/main.cpp -g -o ./bin/slime --std=c++17 || exit 1 echo "" diff --git a/src/defines.cpp b/src/defines.cpp index 37671de..63a192b 100644 --- a/src/defines.cpp +++ b/src/defines.cpp @@ -28,7 +28,7 @@ constexpr bool is_debug_build = false; else \ while (1) \ if (1) { \ - if(Globals::error) { \ + if (Globals::error) { \ if (Globals::log_level == Log_Level::Debug) { \ printf("in %s:%d\n", __FILE__, __LINE__); \ } \ @@ -44,7 +44,7 @@ constexpr bool is_debug_build = false; else \ while (1) \ if (1) { \ - if(Globals::error) { \ + if (Globals::error) { \ if (Globals::log_level == Log_Level::Debug) { \ printf("in %s:%d\n", __FILE__, __LINE__); \ } \ diff --git a/src/error.cpp b/src/error.cpp index 35bd121..11bb1b6 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -8,7 +8,7 @@ proc delete_error() -> void { } proc create_error(const char* c_file_name, int c_file_line, Lisp_Object* type, String* message) -> void { - + visualize_lisp_machine(); printf("Error created in:\n%s:%d\n", c_file_name, c_file_line); delete_error(); diff --git a/src/forward_decls.cpp b/src/forward_decls.cpp index b3d5537..c3bfeac 100644 --- a/src/forward_decls.cpp +++ b/src/forward_decls.cpp @@ -14,6 +14,8 @@ proc print_environment(Environment*) -> void; proc Lisp_Object_Type_to_string(Lisp_Object_Type type) -> const char*; +proc visualize_lisp_machine() -> void; + namespace Memory { proc create_built_ins_environment() -> Environment*; proc get_or_create_lisp_object_keyword(const char* identifier) -> Lisp_Object*; diff --git a/src/slime.h b/src/slime.h index 9e32f1a..e465dcd 100644 --- a/src/slime.h +++ b/src/slime.h @@ -23,6 +23,7 @@ namespace Slime { # include "./env.cpp" # include "./parse.cpp" # include "./eval.cpp" +# include "./visualization.cpp" # include "./built_ins.cpp" # include "./testing.cpp" # include "./undefines.cpp" diff --git a/src/testing.cpp b/src/testing.cpp index 6d84f91..6ab3d45 100644 --- a/src/testing.cpp +++ b/src/testing.cpp @@ -485,16 +485,17 @@ proc test_file(const char* file) -> testresult { Memory::reset(); assert_no_error(); - Environment* env = Memory::create_built_ins_environment(); + Environment* root_env = Memory::create_built_ins_environment(); assert_no_error(); - - Parser::environment_for_macros = env; + Environment* user_env = Memory::create_child_environment(root_env); assert_no_error(); - built_in_load(Memory::create_string("pre.slime"), env); + Parser::environment_for_macros = root_env; + + built_in_import(Memory::create_string("pre.slime"), user_env); assert_no_error(); - Lisp_Object* result = built_in_load(Memory::create_string(file), env); + Lisp_Object* result = built_in_load(Memory::create_string(file), user_env); assert_no_error(); return pass; @@ -532,6 +533,7 @@ proc run_all_tests() -> bool { invoke_test_script("lexical_scope"); invoke_test_script("class_macro"); invoke_test_script("sicp"); + invoke_test_script("import_and_load"); return result; } diff --git a/src/visualization.cpp b/src/visualization.cpp new file mode 100644 index 0000000..b6c8e27 --- /dev/null +++ b/src/visualization.cpp @@ -0,0 +1,65 @@ +proc visualize_lisp_machine() -> void { + const int padding = 30; + const int margin = 20; + + FILE *f = fopen("visualization.svg", "w"); + defer { + fclose(f); + }; + + if (f == NULL) { + create_generic_error("The file for writing the visualization" + "could not be opened for writing"); + return; + } + + int max_x = 0, + max_y = 0, + write_x = 0, + write_y = 0; + + proc draw_text = [&](const char* text) { + int text_width = 12 * strlen(text); + int text_height = 12; + + if (write_x + text_width > max_x) max_x = write_x + text_width; + if (write_y > max_y) max_y = write_y; + + fprintf(f, + " \n" + " %s" + "\n \n", write_x, write_y, text); + + write_x += text_width; + }; + + proc draw_header = [&](){ + write_y = 12; + // draw_text("ASD"); + // write_x += margin; + draw_text("doeun"); + + }; + + fprintf(f, + "\n" + "\n\n", -padding, -padding, 0, 0); + + draw_header(); + + fprintf(f, "\n\n"); + + // fill in the correct viewBox + rewind(f); + + fprintf(f, + "\n" + "