about summary refs log blame commit diff stats
path: root/cpp/002main.cc
blob: 7aac3d6bdfd5d622141d575dceb5e9c24c282073 (plain) (tree)
1
2
3
4
5
6
7
8






                        
 











































































































                                                                          












































                                                                    















                                               
enum recipe_number {
  // arithmetic
  add = 1,
  subtract,
  multiply,
  divide,
  divide_with_remainder,

  // boolean
  conjunction,  // 'and' is a keyword
  disjunction,  // 'or' is a keyword
  negation,  // 'not' is a keyword

  // comparison
  equal,
  not_equal,
  less_than,
  greater_than,
  lesser_or_equal,
  greater_or_equal,

  // control flow
  jump,
  jump_if,
  jump_unless,

  // data management: scalars, arrays, and_records (structs)
  copy,
  get,
  get_address,
  index,
  index_address,
  allocate,
  size,
  length,

  // tagged_values require one primitive
  save_type,

  // code points for characters
  character_to_integer,
  integer_to_character,

  // multiprocessing
  fork,
  fork_helper,
  sleep,
  assert,
  assert_false,

  // cursor-based (text mode) interaction
  cursor_mode,
  retro_mode,
  clear_host_screen,
  clear_line_on_host,
  cursor_on_host,
  cursor_on_host_to_next_line,
  cursor_up_on_host,
  cursor_down_on_host,
  cursor_right_on_host,
  cursor_left_on_host,
  print_character_to_host,
  read_key_from_host,

  // debugging aides
  _dump_memory,
  _dump_trace,
  _start_tracing,
  _stop_tracing,
  _dump_routine,
  _dump_channel,
  _quit,
  _wait_for_key_from_host,
  _print,

  // first-class continuations
  current_continuation,
  continue_from,

  // user-defined functions
  next_input,
  input,
  prepare_reply,
  reply,

  Max_primitive_recipe,
};

struct property {
  vector<string> values;
};

typedef int type_number;

struct type_info {
  int size;
  bool is_address;
  bool is_record;
  bool is_array;
  vector<type_number> target;  // only if is_address
  vector<vector<type_number> > elements;  // only if is_record or is_array
};

unordered_map<type_number, type_info> type;

struct reagent {
  string name;
  vector<type_number> types;
  vector<pair<string, property> > properties;
};

struct instruction {
  recipe_number op;
  vector<reagent> ingredients;
  vector<reagent> products;
};

void load(const char* filename) {
}

void run(const char* function_name) {
}



//// test harness

void run_tests() {
  for (unsigned long i=0; i < sizeof(Tests)/sizeof(Tests[0]); ++i) {
    START_TRACING_UNTIL_END_OF_SCOPE;
    setup();
    CLEAR_TRACE;
    (*Tests[i])();
    verify();
  }
  cerr << '\n';
  if (Num_failures > 0)
    cerr << Num_failures << " failure"
         << (Num_failures > 1 ? "s" : "")
         << '\n';
}

void verify() {
  if (!Passed)
    ;
  else
    cerr << ".";
}

void setup() {
  Passed = true;
}

string time_string() {
  time_t t;
  time(&t);
  char buffer[10];
  if (!strftime(buffer, 10, "%H:%M:%S", localtime(&t)))
    return "";
  return buffer;
}

}  // end namespace mu

int main(int argc, const char* argv[]) {
  if (argc == 2 && string(argv[1]) == "test") {
    mu::run_tests();
    return 0;
  }

  for (int i = 1; i < argc; ++i) {
    mu::load(argv[i]);
  }
  mu::run("main");
}

namespace mu {