Decrease compilation time by removing "Retro" from c++ compiled and making a chaiscript version instead

This commit is contained in:
Jason Turner
2009-09-09 03:11:47 +00:00
parent cc44ec99ba
commit e2cdac0406
2 changed files with 18 additions and 38 deletions

View File

@@ -9,7 +9,7 @@
//Note, the expression "[x,y]" in "collate" is parsed as two separate expressions
//by C++, so CODE_STRING, takes two expressions and adds in the missing comma
#define CODE_STRING(x, y) #x ", " #y
#define CODE_STRING(x, y, z) #x ", " #y ", " #z
#define chaiscript_prelude CODE_STRING(\
def new(x) { eval(type_name(x))(); } \
@@ -52,13 +52,27 @@ def insert_at(container, pos, x) { container.insert_ref_at(pos, clone(x)); } \n\
# Returns the reverse of the given container\n\
def reverse(container) {\
var retval = new(container); \
var r = retro(range(container)); \
var r = range(container); \
while (!r.empty()) { \
retval.push_back(r.front()); \
r.pop_front(); \
retval.push_back(r.back()); \
r.pop_back(); \
} \
retval; \
} \
# Returns true if the object is a retro object\n\
def is_retro(r) { call_exists(count, r, "data_type") && r.count("data_type") == 1 && r["data_type"] == "retro" }\n\
# Creates a retro from a retro by returning the original range\n\
def retro(r) : is_retro(r) { clone(r["data"]) }\n\
# Creates a retro range from a range\n\
def retro(r) : call_exists(empty, r) && call_exists(pop_front, r) && call_exists(pop_back, r) && call_exists(back, r) && call_exists(front, r) { var m = ["data_type":"retro", "data":r]; }\n\
# Returns the first value of a retro\n\
def front(r) : is_retro(r) { back(r["data"]) }\n\
# Returns the last value of a retro\n\
def back(r) : is_retro(r) { front(r["data"]) }\n\
# Moves the back iterator of a retro towards the front by one \n\
def pop_back(r) : is_retro(r) { pop_front(r["data"]) }\n\
# Moves the front iterator of a retro towards the back by one \n\
def pop_front(r) : is_retro(r) { pop_back(r["data"]) } \n\
# Performs the second value function over the container first value\n\
def for_each(container, func) : call_exists(range, container) { \
var range = range(container); \