diff options
-rw-r--r-- | ack.tpr | 7 | ||||
-rw-r--r-- | fac.tpr | 5 | ||||
-rw-r--r-- | list.tpr | 3 | ||||
-rw-r--r-- | tuplr.cpp | 14 |
4 files changed, 21 insertions, 8 deletions
@@ -0,0 +1,7 @@ +(def ack (fn (m n) + (if (= 0 m) (+ n 1) + (= 0 n) (ack (- m 1) 1) + (ack (- m 1) (ack m (- n 1)))))) + +(ack 3 10) + @@ -0,0 +1,5 @@ +(def fac (fn (n) + (if (= 0 n) 1 + (* n (fac (- n 1)))))) + +(fac 5) diff --git a/list.tpr b/list.tpr new file mode 100644 index 0000000..947fe97 --- /dev/null +++ b/list.tpr @@ -0,0 +1,3 @@ +(def l (cons 1 (cons 2 (cons 3 4)))) + +(car (cdr (cdr l))) @@ -811,12 +811,10 @@ ASTSymbol::compile(CEnv& cenv) void ASTClosure::lift(CEnv& cenv) { - if (cenv.tenv.type(at(2))->var) - throw Error("Closure with untyped body lifted"); - for (size_t i = 0; i < prot->size(); ++i) - if (cenv.tenv.type(prot->at(i))->var) - throw Error("Closure with untyped parameter lifted"); - + if (cenv.tenv.type(at(2))->var || !cenv.tenv.type(prot)->concrete()) { + std::cerr << "Closure has variable type, not lifting" << endl; + return; + } assert(!func); cenv.push(); @@ -851,8 +849,7 @@ ASTClosure::lift(CEnv& cenv) Value* ASTClosure::compile(CEnv& cenv) { - assert(func); - return func; // Function was already compiled in the lifting pass + return func; } void @@ -1139,6 +1136,7 @@ eval(CEnv& cenv, ExecutionEngine* engine, const string& name, istream& is) // Create function for top-level of program ASTTuple prot; const Type* ctype = resultType->type(); + assert(ctype); Function* f = compileFunction(cenv, cenv.gensym("input"), ctype, prot); BasicBlock* bb = BasicBlock::Create("entry", f); cenv.builder.SetInsertPoint(bb); |