Add lexical closures
diff --git a/src/lisp/lib/std.c b/src/lisp/lib/std.c
index 485bf49..028dd3d 100644
--- a/src/lisp/lib/std.c
+++ b/src/lisp/lib/std.c
@@ -39,6 +39,17 @@
 	return nil;
 }
 
+value_t l_apply(value_t func, value_t args)
+{
+	if (!closurep(func))
+		return nil;
+
+	if (!listp(args))
+		return nil;
+
+	return call_list_closure((struct closure *)(func ^ CLOSURE_TAG), args);
+}
+
 void add_function(struct environment *env, char *name, void *func, int nargs, enum namespace ns)
 {
 	struct function *last, *new = malloc(sizeof(struct function));
@@ -65,4 +76,6 @@
 	add_function(env, "cons", cons, 2, NS_FUNCTION);
 
 	add_function(env, "print", l_printval, 1, NS_FUNCTION);
+
+	add_function(env, "apply", l_apply, 2, NS_FUNCTION);
 }
diff --git a/src/lisp/lib/std.h b/src/lisp/lib/std.h
index 5162bab..9070de8 100644
--- a/src/lisp/lib/std.h
+++ b/src/lisp/lib/std.h
@@ -4,6 +4,7 @@
 #include "../lisp.h"
 
 value_t l_plus(value_t a, value_t b);
+value_t l_printval(value_t val);
 
 void add_function(struct environment *env, char *name, void *func, int nargs, enum namespace ns);
 void load_std(struct environment *env);