From 37e4573b9382707a0c345246d7507dc269bd0df3 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Mon, 16 Mar 2015 21:08:28 -0700 Subject: 934 - extensible transform framework for mu's lightweight tools --- cpp/010vm | 1 + cpp/012run | 1 + cpp/023transform | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 cpp/023transform diff --git a/cpp/010vm b/cpp/010vm index 53496fde..a8dd451a 100644 --- a/cpp/010vm +++ b/cpp/010vm @@ -12,6 +12,7 @@ int Next_recipe_number = 1; struct recipe { string name; vector steps; + // End Recipe Fields }; :(before "struct recipe") diff --git a/cpp/012run b/cpp/012run index 3d1395a9..bb084b39 100644 --- a/cpp/012run +++ b/cpp/012run @@ -90,6 +90,7 @@ if (argc > 1) { //: helper for tests :(before "End Globals") +// track recipes added so that we can cleanup after each test vector recipes_added_by_test; :(code) diff --git a/cpp/023transform b/cpp/023transform new file mode 100644 index 00000000..3ab2cdbb --- /dev/null +++ b/cpp/023transform @@ -0,0 +1,36 @@ +//: Let's start making mu more ergonomic to use. We'll create a list of tools +//: that each transform a recipe. Anybody can add to the list. +//: +//: The hope is that this framework of transform tools will provide a +//: deconstructed alternative to conventional compilers. + +:(replace{} "void run(string form)") +void run(string form) { + vector tmp = add_recipes(form); + recipes_added_by_test.insert(recipes_added_by_test.end(), tmp.begin(), tmp.end()); + transform_all(); + run(recipes_added_by_test.front()); +} + +:(before "End Recipe Fields") +size_t transformed_until; + recipe() :transformed_until(0) {} + +:(before "End Types") +typedef void (*transform_fn)(recipe_number); + +:(before "End Globals") +vector Transform; + +:(code) +void transform_all() { + for (size_t t = 0; t < Transform.size(); ++t) { + for (unordered_map::iterator p = Recipe.begin(); p != Recipe.end(); ++p) { + recipe& r = p->second; + if (r.steps.empty()) continue; + if (r.transformed_until != t-1) continue; + (*Transform[t])(/*recipe_number*/p->first); + r.transformed_until = t; + } + } +} -- cgit 1.4.1-2-gfad0