diff --git a/Epic/Bytecode.lhs b/Epic/Bytecode.lhs
--- a/Epic/Bytecode.lhs
+++ b/Epic/Bytecode.lhs
@@ -253,7 +253,7 @@
 >     ecomp lazy tcall (ForeignCall ty fn argtypes) reg vs = do
 >           savetmp <- get_tmp
 >           let (args,types) = unzip argtypes
->           (argcode, argregs) <- ecompsEv lazy args vs
+>           (argcode, argregs) <- ecompsEv (fst lazy, False) args vs
 >           -- let evalcode = if (snd lazy) then [] else map (\x -> EVAL x (snd lazy)) argregs
 >           set_tmp savetmp
 >           return $ argcode ++ [FOREIGN ty reg fn (zip argregs types),
@@ -356,7 +356,8 @@
 >           = do reg' <- new_tmp
 >                (argcode, argregs) <- ecomps lazy args vs
 >                fcode <- ecomp lazy Middle f reg' vs
->                return $ fcode ++ argcode ++ [ADDARGS reg reg' argregs]
+>                return $ fcode ++ argcode ++ [ADDARGS reg reg' argregs] ++
+>                           if (not (fst lazy)) then [EVAL reg (snd lazy)] else []
 
 >     ccomp (MkInt i) reg = return [INT reg i]
 >     ccomp (MkBigInt i) reg = return [BIGINT reg i]
diff --git a/Epic/CodegenC.lhs b/Epic/CodegenC.lhs
--- a/Epic/CodegenC.lhs
+++ b/Epic/CodegenC.lhs
@@ -75,6 +75,7 @@
 > workers _ [] = ""
 > workers ctxt (decl@(Decl fname ret func@(Bind args locals defn _) _ _):xs) =
 >     -- trace (show fname ++ ": " ++ show defn) $
+>     "/*\n " ++ show func ++ "\n*/\n" ++
 >     "void* " ++ quickcall fname ++ "(" ++ showargs args 0 ++ ") {\n" ++
 >      compileBody (compile ctxt fname func) ++ "\n}\n\n" ++ exportC decl ++
 >     workers ctxt xs
@@ -269,6 +270,7 @@
 
 > cToEpic var TyString = "MKSTR((char*)(" ++ var ++ "))"
 > cToEpic var TyInt = "MKINT(INTTOEINT(" ++ var ++ "))"
+> cToEpic var TyChar = "MKINT(INTTOEINT(" ++ var ++ "))"
 > cToEpic var TyPtr = "MKPTR(" ++ var ++ ")"
 > -- cToEpic var TyBigInt = "MKBIGINT((mpz_t*)(" ++ var ++ "))" -- now just a VAL
 > cToEpic var TyFloat = "MKFLOAT(" ++ var ++ ")"
diff --git a/Epic/Epic.lhs b/Epic/Epic.lhs
--- a/Epic/Epic.lhs
+++ b/Epic/Epic.lhs
@@ -21,10 +21,11 @@
 >                  lazy_, effect_,
 >                  foreign_, foreignL_, foreignConst_, foreignConstL_,
 >                  let_, letN_, update_, op_,
->                  str, int, float, char, bool, unit_, (!.), fn, ref, (+>),
+>                  str, int, bigint, float, char, bool, unit_, 
+>                  (!.), fn, ref, (+>),
 >                  malloc_,
 >                  -- * Types
->                  Type, tyInt, tyChar, tyBool, tyFloat, tyString,
+>                  Type, tyInt, tyBigInt, tyChar, tyBool, tyFloat, tyString,
 >                  tyPtr, tyUnit, tyAny, tyC,
 >                  -- * Operators
 >                  Op, plus_, minus_, times_, divide_, 
@@ -370,6 +371,10 @@
 > int :: Int -> Term
 > int x = term $ Const (MkInt x)
 
+> -- | Constant big integer
+> bigint :: Integer -> Term
+> bigint x = term $ Const (MkBigInt x)
+
 > -- | Constant float
 > float :: Double -> Term
 > float x = term $ Const (MkFloat x)
@@ -391,10 +396,12 @@
 > (+>) :: (EpicExpr c) => c -> Term -> Term
 > (+>) c k = let_ c (\(x :: Expr) -> k)
 
-> tyInt, tyChar, tyBool, tyFloat, tyString, tyPtr, tyUnit, tyAny :: Type
+> tyInt, tyBigInt, tyChar, tyBool, tyFloat :: Type
+> tyString, tyPtr, tyUnit, tyAny :: Type
 > tyC :: String -> Type
 
 > tyInt    = TyInt
+> tyBigInt = TyBigInt
 > tyChar   = TyChar
 > tyBool   = TyBool
 > tyFloat  = TyFloat
diff --git a/Epic/Scopecheck.lhs b/Epic/Scopecheck.lhs
--- a/Epic/Scopecheck.lhs
+++ b/Epic/Scopecheck.lhs
@@ -173,7 +173,7 @@
 > v_ise ((n,ty):args) i = let rest = v_ise args (i+1) in
 >                             case lookup n rest of
 >                               Nothing -> (n,i):rest
->                               _ -> rest
+>                               Just i' -> (n,i'):rest
 
        where dropArg n [] = []
              dropArg n ((x,i):xs) | x == n = dropArg n xs
diff --git a/epic.cabal b/epic.cabal
--- a/epic.cabal
+++ b/epic.cabal
@@ -1,5 +1,5 @@
 Name:		epic
-Version:	0.9
+Version:	0.9.2
 Author:		Edwin Brady
 License:	BSD3
 License-file:	LICENSE
diff --git a/evm/closure.c b/evm/closure.c
--- a/evm/closure.c
+++ b/evm/closure.c
@@ -724,7 +724,7 @@
     }
 
     fn->fn = (void*)f;
-    fn->numargs = 2;
+    fn->numargs = 3;
     fn->args = MKARGS(3);
     fn->args[0] = a1;
     fn->args[1] = a2;
@@ -746,7 +746,7 @@
     }
 
     fn->fn = (void*)f;
-    fn->numargs = 2;
+    fn->numargs = 4;
     fn->args = MKARGS(4);
     fn->args[0] = a1;
     fn->args[1] = a2;
@@ -769,7 +769,7 @@
     }
 
     fn->fn = (void*)f;
-    fn->numargs = 2;
+    fn->numargs = 5;
     fn->args = MKARGS(5);
     fn->args[0] = a1;
     fn->args[1] = a2;
@@ -1084,7 +1084,14 @@
 
 // Since MKSTR is used to build strings from foreign calls, the string
 // itself will already have been allocated so we just want the closure.
-    c->info=(void*)x;
+
+// If the foreign call has returned NULL, though, make an empty string.
+
+    if (x == NULL) {
+        return MKSTR("");
+    } else {
+        c->info=(void*)x;
+    }
     EREADY(c);
     return c;
 }
@@ -1110,7 +1117,7 @@
     exit(1);
 }
 
-void* MKFREE(int x)
+void* MKFREE(intptr_t x)
 {
     VAL c = MKCLOSURE;
     SETTY(c, FREEVAR);
diff --git a/evm/closure.h b/evm/closure.h
--- a/evm/closure.h
+++ b/evm/closure.h
@@ -69,9 +69,9 @@
 #define MKCLOSURE (Closure*)EMALLOC(sizeof(Closure))
 #define MKUNIT (void*)0
 
-#define INTOP(op,x,y) MKINT((((eint)x)>>1) op (((eint)y)>>1))
+#define INTOP(op,x,y) MKINT((eint)((((eint)x)>>1) op (((eint)y)>>1)))
 #define FLOATOP(op,x,y) MKFLOAT(((GETFLOAT(x)) op (GETFLOAT(y))))
-#define FLOATBOP(op,x,y) MKINT(((GETFLOAT(x)) op (GETFLOAT(y))))
+#define FLOATBOP(op,x,y) MKINT((eint)(((GETFLOAT(x)) op (GETFLOAT(y)))))
 #define ADD(x,y) (void*)(((eint)x)+(((eint)y)-1))
 #define MULT(x,y) (MKINT((((eint)x)>>1) * (((eint)y)>>1)))
 #define CHECKEVALUATED(x) if(ISFUN(x) || ISTHUNK(x) \
@@ -280,7 +280,7 @@
 // vm->roots=rootbase;
 
 #define INTTOEINT(x) ((eint)(x))
-#define EINTTOINT(x) ((int)(x))
+#define EINTTOINT(x) ((intptr_t)(x))
 
 //void* MKINT(int x);
 mpz_t* NEWBIGINTI(int val);
@@ -299,7 +299,7 @@
 double GETFLOAT(void* x);
 //void* GETPTR(void* x);
 
-void* MKFREE(int x);
+void* MKFREE(intptr_t x);
 
 // Exit with fatal error
 void ERROR(char* msg);
diff --git a/evm/libevm.a b/evm/libevm.a
Binary files a/evm/libevm.a and b/evm/libevm.a differ
diff --git a/evm/stdfuns.c b/evm/stdfuns.c
--- a/evm/stdfuns.c
+++ b/evm/stdfuns.c
@@ -52,7 +52,16 @@
 }
 
 // FIXME: Do this properly!
-void* freadStr(void* h) {
+char* freadStr(void* h) {
+    char *buf = NULL;
+    if (buf==NULL) { buf = EMALLOC(sizeof(char)*512); } // yeah, right...
+    fgets(buf,512,(FILE*)h);
+//    char *loc = strchr(buf,'\n');
+//    if (loc) *(loc+1) = '\0'; else buf[0]='\0';
+    return buf;
+}
+
+void* freadStrAny(void* h) {
     static char bufin[128];
     bufin[0]='\0';
 
@@ -89,7 +98,11 @@
 
 int strToInt(char* str)
 {
-    return strtol(str,NULL,10);
+    char* end;
+    if (str == NULL) return 0;
+    int v = strtol(str,&end,10);
+
+    if (*end != '\0') return 0; else return v;
 }
 
 char* intToStr(int x)
@@ -194,12 +207,12 @@
 
 VAL addBig(VAL x, VAL y) {
     if (ISINT(x) && ISINT(y)) {
-	int vx = GETINT(x);
-	int vy = GETINT(y);
+	intptr_t vx = GETINT(x);
+	intptr_t vy = GETINT(y);
 	if ((vx <= 0 && vy >=0) || (vx >=0 && vy <=0)) {
 	    return INTOP(+,x,y);
 	}
-	int res = vx + vy;
+	intptr_t res = vx + vy;
 	if (res >= 1<<30 || res <= -(1 << 30)) {
 	    return MKBIGINT(addBigInt(*(NEWBIGINTI(vx)), *(NEWBIGINTI(vy))));
 	} else {
@@ -218,12 +231,12 @@
 
 VAL subBig(VAL x, VAL y) {
     if (ISINT(x) && ISINT(y)) {
-	int vx = GETINT(x);
-	int vy = GETINT(y);
+	intptr_t vx = GETINT(x);
+	intptr_t vy = GETINT(y);
 	if ((vx <= 0 && vy <=0) || (vx >=0 && vy >=0)) {
 	    return INTOP(-,x,y);
 	}
-	int res = vx - vy;
+	intptr_t res = vx - vy;
 	if (res >= 1<<30 || res <= -(1 << 30)) {
 	    return MKBIGINT(subBigInt(*(NEWBIGINTI(vx)), *(NEWBIGINTI(vy))));
 	} else {
@@ -363,6 +376,11 @@
     mpz_init(*answer);
     mpz_set_str(*answer, str, 10);
     return answer;
+}
+
+void* intToBigInt(int x)
+{
+   return MKINT(INTTOEINT(x)); 
 }
 
 char* bigIntToStr(mpz_t x)
diff --git a/evm/stdfuns.h b/evm/stdfuns.h
--- a/evm/stdfuns.h
+++ b/evm/stdfuns.h
@@ -32,7 +32,8 @@
 
 void* fileOpen(char* name, char* mode);
 void fileClose(void* h);
-void* freadStr(void* h);
+char* freadStr(void* h);
+void* freadStrAny(void* h);
 void fputStr(void* h, char* str);
 
 int isNull(void* ptr);
@@ -62,6 +63,8 @@
 
 double intToFloat(int x);
 int floatToInt(double x);
+
+void* intToBigInt(int x);
 
 mpz_t* strToBigInt(char* str);
 char* bigIntToStr(mpz_t x);
