Add "if" built-in
diff --git a/src/lisp/.clang-format b/src/lisp/.clang-format
index 419e428..45b774a 100644
--- a/src/lisp/.clang-format
+++ b/src/lisp/.clang-format
@@ -1,12 +1,4 @@
+---
 BasedOnStyle: Microsoft
-
-AlignAfterOpenBracket: Align
-SpacesInSquareBrackets: true
-SpaceInEmptyBlock: true
-SpacesInConditionalStatement: true
-SpaceBeforeParens: Always
 UseTab: ForIndentation
-TabWidth: 4
 ColumnLimit: 80
-
-ForEachMacros: ['FOREACH']
\ No newline at end of file
diff --git a/src/lisp/Jmk b/src/lisp/Jmk
index 17ee1ff..aa75bf6 100644
--- a/src/lisp/Jmk
+++ b/src/lisp/Jmk
@@ -16,13 +16,8 @@
 OBJECTS = main.o \
 			lisp.o \
 			compiler.o \
-			lib/std.o
-
-ifeq ($(PLAT),linux)
-OBJECTS += plat/linux.o
-else
-$(error linux is the only supported option for PLAT)
-endif
+			lib/std.o \
+			plat/linux.o
 
 LUA = vendor/luajit/src/host/minilua
 
@@ -42,6 +37,6 @@
 
 format:
 	status_log(FORMAT, *)
-	@clang-format -i *.c *.h *.dasc
+	@clang-format -i *.c *.h *.dasc plat/* lib/*
 
 finish
diff --git a/src/lisp/compiler.dasc b/src/lisp/compiler.dasc
index eac885a..e5a9444 100644
--- a/src/lisp/compiler.dasc
+++ b/src/lisp/compiler.dasc
@@ -1,13 +1,13 @@
 /* -*- mode:c -*- */
 
 #include "compiler.h"
-#include "plat/plat.h"
 #include "lib/std.h"
+#include "plat/plat.h"
 
 #include <dasm_proto.h>
 #include <dasm_x86.h>
 
-#define value_size sizeof (value_t)
+#define value_size sizeof(value_t)
 
 |.arch x86;
 
@@ -26,13 +26,13 @@
 dasm_State *d;
 unsigned int npc = 8;
 
-struct function *find_function (struct environment *env, char *name)
+struct function *find_function(struct environment *env, char *name)
 {
 	struct function *f = env->first;
 
-	while ( strcmp (f->name, name) != 0 )
+	while (strcmp(f->name, name) != 0)
 	{
-		if ( f->prev )
+		if (f->prev)
 			f = f->prev;
 		else
 			return NULL;
@@ -41,120 +41,160 @@
 	return f;
 }
 
-void compile_tl (value_t val, struct environment *env)
+void compile_tl(value_t val, struct environment *env)
 {
-	if ( !listp (val) )
-		err ("Top level must be a list");
-	
-	value_t form = car (val);
-	value_t args = cdr (val);
+	if (!listp(val))
+		err("Top level must be a list");
 
-	if ( symstreq (form, "defun") )
+	value_t form = car(val);
+	value_t args = cdr(val);
+
+	if (symstreq(form, "defun"))
 	{
 		dasm_State *d;
 		dasm_State **Dst = &d;
 
 		|.section code;
-		dasm_init (&d, DASM_MAXSECTION);
-		
+		dasm_init(&d, DASM_MAXSECTION);
+
 		|.globals lbl_;
-		void *labels[ lbl__MAX ];
-		dasm_setupglobal (&d, labels, lbl__MAX);
-		
+		void *labels[lbl__MAX];
+		dasm_setupglobal(&d, labels, lbl__MAX);
+
 		|.actionlist lisp_actions;
-		dasm_setup (&d, lisp_actions);
-		
-		dasm_growpc (&d, npc);
+		dasm_setup(&d, lisp_actions);
+
+		dasm_growpc(&d, npc);
 
 		struct local local;
 		local.first = NULL;
 		local.num_vars = 0;
-	
+
 		// Generate code
-		
+
 		| setup 0;
-		
-		value_t name = car (args);
-		args = cdr (args);
-		value_t arglist = car (args);
-		value_t body = cdr (args);
 
-		if ( (name & HEAP_MASK) != SYMBOL_TAG )
-			err ("function name must be a symbol");
+		value_t name = car(args);
+		args = cdr(args);
+		value_t arglist = car(args);
+		value_t body = cdr(args);
 
-		for ( ; !nilp (body); body = cdr (body) )
+		if ((name & HEAP_MASK) != SYMBOL_TAG)
+			err("function name must be a symbol");
+
+		for (; !nilp(body); body = cdr(body))
 		{
-			compile_expression (env, &local, car (body), Dst);
+			compile_expression(env, &local, car(body), Dst);
 		}
 
 		| cleanup;
 
-		add_function (env, (char *) (name ^ SYMBOL_TAG), link (Dst), length (arglist));
+		add_function(env, (char *)(name ^ SYMBOL_TAG), link(Dst),
+		             length(arglist));
 
-		dasm_free (&d);
+		dasm_free(&d);
 	}
 }
 
-struct environment compile_all (struct istream *is)
+struct environment compile_all(struct istream *is)
 {
 	value_t val;
 	struct environment env;
 	env.first = NULL;
-	load_std (&env);
-	
-	while ( read1 (is, &val) )
+	load_std(&env);
+
+	while (read1(is, &val))
 	{
-		compile_tl (val, &env);
+		compile_tl(val, &env);
 	}
 
 	return env;
 }
 
-void compile_expression (struct environment *env, struct local *local,
-                         value_t val, dasm_State **Dst)
+int nextpc(struct local *local, dasm_State **Dst)
 {
-	if ( integerp (val) || stringp (val) || symbolp (val) )
+	int n = local->nextpc++;
+	if (n > local->npc)
+	{
+		local->npc += 16;
+		dasm_growpc(Dst, local->npc);
+	}
+	return n;
+}
+
+void compile_expression(struct environment *env, struct local *local,
+                        value_t val, dasm_State **Dst)
+{
+	if (symstreq(val, "nil"))
+	{
+		| mov eax, (nil);
+	}
+	else if (integerp(val) || stringp(val) || symbolp(val))
 	{
 		| mov eax, val;
 	}
-	else if ( listp (val) )
+	else if (listp(val))
 	{
-		value_t fsym = car (val);
+		value_t fsym = car(val);
+		value_t args = cdr(val);
+		int nargs = length(args);
 
-		if ( !symbolp (fsym) )
+		if (!symbolp(fsym))
 		{
-			err ("function name must be a symbol");
+			err("function name must be a symbol");
 		}
 
-		struct function *func = find_function (env, (char *) (fsym ^ SYMBOL_TAG));
-		value_t args = cdr (val);
-		int nargs = length (args);
-
-		if ( nargs != func->nargs )
-			err ("wrong number of args");
-
-		for ( int i = length (args) - 1; i >= 0; i-- )
+		if (symstreq(fsym, "if"))
 		{
-			compile_expression (env, local, elt (args, i), Dst);
-			| push eax;
-		}
+			if (nargs < 2 || nargs > 3)
+				err("Must give at least 2 arguments to if");
 
-		| mov ebx, (func->code_addr);
-		| call ebx;
-		| add esp, (nargs * 4);
-		// result in eax
+			compile_expression(env, local, car(args), Dst);
+			int false_label = nextpc(local, Dst),
+			    after_label = nextpc(local, Dst);
+
+			// result is in eax
+			| cmp eax, (nil);
+			| je =>false_label;
+
+			compile_expression(env, local, elt(args, 1), Dst);
+
+			|=>false_label:
+			if (nargs == 3)
+			    compile_expression(env, local, elt(args, 2), Dst);
+			|=>after_label:
+		}
+		else
+		{
+			struct function *func =
+			    find_function(env, (char *)(fsym ^ SYMBOL_TAG));
+
+			if (nargs != func->nargs)
+				err("wrong number of args");
+
+			for (int i = length(args) - 1; i >= 0; i--)
+			{
+				compile_expression(env, local, elt(args, i), Dst);
+				| push eax;
+			}
+
+			| mov ebx, (func->code_addr);
+			| call ebx;
+			| add esp, (nargs * 4);
+			// result in eax
+		}
 	}
 }
 
-void compile_expr_to_func (struct environment *env, char *name, value_t val,
-                           dasm_State **Dst)
+void compile_expr_to_func(struct environment *env, char *name, value_t val,
+                          dasm_State **Dst)
 {
 	| setup 0;
 
 	struct local local;
-	compile_expression (env, &local, val, Dst);
-	
+	compile_expression(env, &local, val, Dst);
+
 	| cleanup;
 
-	add_function (env, name, link (Dst), 0);
+	add_function(env, name, link(Dst), 0);
 }
diff --git a/src/lisp/compiler.h b/src/lisp/compiler.h
index b3bd89c..ae66001 100644
--- a/src/lisp/compiler.h
+++ b/src/lisp/compiler.h
@@ -11,10 +11,10 @@
 	int nargs; // number of arguments
 
 	union {
-		value_t (*def0) ();
-		value_t (*def1) (value_t);
-		value_t (*def2) (value_t, value_t);
-		value_t (*def3) (value_t, value_t, value_t);
+		value_t (*def0)();
+		value_t (*def1)(value_t);
+		value_t (*def2)(value_t, value_t);
+		value_t (*def3)(value_t, value_t, value_t);
 		void *code_ptr;
 		uintptr_t code_addr;
 	};
@@ -39,13 +39,16 @@
 {
 	int num_vars;
 	struct variable *first;
+	int npc;
+	int nextpc;
 };
 
-void compile_expression (struct environment *env, struct local *local,
-                         value_t val, dasm_State **Dst);
-void compile_expr_to_func (struct environment *env, char *name, value_t val,
-                           dasm_State **Dst);
+void compile_expression(struct environment *env, struct local *local,
+                        value_t val, dasm_State **Dst);
+void compile_expr_to_func(struct environment *env, char *name, value_t val,
+                          dasm_State **Dst);
+int nextpc(struct local *local, dasm_State **Dst);
 // Compile top-level declaration
-void compile_tl (value_t val, struct environment *env);
-struct environment compile_all (struct istream *is);
-struct function *find_function (struct environment *env, char *name);
+void compile_tl(value_t val, struct environment *env);
+struct environment compile_all(struct istream *is);
+struct function *find_function(struct environment *env, char *name);
diff --git a/src/lisp/lib/std.c b/src/lisp/lib/std.c
index 9c1f3cb..03e17fc 100644
--- a/src/lisp/lib/std.c
+++ b/src/lisp/lib/std.c
@@ -1,48 +1,47 @@
 #include "std.h"
 #include <stdlib.h>
 
-value_t l_plus (value_t a, value_t b)
+value_t l_plus(value_t a, value_t b)
 {
-	if ( !integerp (a) || !integerp (b) )
+	if (!integerp(a) || !integerp(b))
 		return nil;
 
 	return (((a >> 2) + (b >> 2)) << 2) | INT_TAG;
 }
 
-value_t l_minus (value_t a, value_t b)
+value_t l_minus(value_t a, value_t b)
 {
-	if ( !integerp (a) || !integerp (b) )
+	if (!integerp(a) || !integerp(b))
 		return nil;
 
 	return (((a >> 2) - (b >> 2)) << 2) | INT_TAG;
 }
 
-value_t l_times (value_t a, value_t b)
+value_t l_times(value_t a, value_t b)
 {
-	if ( !integerp (a) || !integerp (b) )
+	if (!integerp(a) || !integerp(b))
 		return nil;
 
 	return (((a >> 2) * (b >> 2)) << 2) | INT_TAG;
 }
 
-value_t l_divide (value_t a, value_t b)
+value_t l_divide(value_t a, value_t b)
 {
-	if ( !integerp (a) || !integerp (b) )
+	if (!integerp(a) || !integerp(b))
 		return nil;
 
 	return (((a >> 2) / (b >> 2)) << 2) | INT_TAG;
 }
 
-value_t l_printval (value_t val)
+value_t l_printval(value_t val)
 {
-	printval (val, 0);
+	printval(val, 0);
 	return nil;
 }
 
-void add_function (struct environment *env, char *name, void *func, int nargs)
+void add_function(struct environment *env, char *name, void *func, int nargs)
 {
-	struct function *last,
-		*new = malloc (sizeof (struct function));
+	struct function *last, *new = malloc(sizeof(struct function));
 
 	last = env->first;
 	new->prev = last;
@@ -53,16 +52,16 @@
 	env->first = new;
 }
 
-void load_std (struct environment *env)
+void load_std(struct environment *env)
 {
-	add_function (env, "+", l_plus, 2);
-	add_function (env, "-", l_minus, 2);
-	add_function (env, "*", l_times, 2);
-	add_function (env, "/", l_divide, 2);
+	add_function(env, "+", l_plus, 2);
+	add_function(env, "-", l_minus, 2);
+	add_function(env, "*", l_times, 2);
+	add_function(env, "/", l_divide, 2);
 
-	add_function (env, "car", car, 1);
-	add_function (env, "cdr", cdr, 1);
-	add_function (env, "cons", cons, 2);
+	add_function(env, "car", car, 1);
+	add_function(env, "cdr", cdr, 1);
+	add_function(env, "cons", cons, 2);
 
-	add_function (env, "print", l_printval, 1);
+	add_function(env, "print", l_printval, 1);
 }
diff --git a/src/lisp/lib/std.h b/src/lisp/lib/std.h
index 85d766c..000129e 100644
--- a/src/lisp/lib/std.h
+++ b/src/lisp/lib/std.h
@@ -1,9 +1,9 @@
 #pragma once
 
-#include "../lisp.h"
 #include "../compiler.h"
+#include "../lisp.h"
 
-value_t l_plus (value_t a, value_t b);
+value_t l_plus(value_t a, value_t b);
 
-void add_function (struct environment *env, char *name, void *func, int nargs);
-void load_std (struct environment *env);
+void add_function(struct environment *env, char *name, void *func, int nargs);
+void load_std(struct environment *env);
diff --git a/src/lisp/lisp b/src/lisp/lisp
index 807bf9f..ecb2972 100755
--- a/src/lisp/lisp
+++ b/src/lisp/lisp
Binary files differ
diff --git a/src/lisp/lisp.c b/src/lisp/lisp.c
index e2b02be..7a7d6cb 100644
--- a/src/lisp/lisp.c
+++ b/src/lisp/lisp.c
@@ -13,31 +13,31 @@
 
 value_t nil = 0b00101111; // magic ;)
 
-void err (const char *msg)
+void err(const char *msg)
 {
-	fprintf (stderr, "ERROR: %s\n", msg);
-	exit (1);
+	fprintf(stderr, "ERROR: %s\n", msg);
+	exit(1);
 }
 
-value_t intval (int i)
+value_t intval(int i)
 {
 	i <<= 2;
 	i |= INT_TAG;
 	return i;
 }
 
-value_t cons (value_t car, value_t cdr)
+value_t cons(value_t car, value_t cdr)
 {
-	struct cons *c = malloc_aligned (sizeof (struct cons));
+	struct cons *c = malloc_aligned(sizeof(struct cons));
 
 	c->car = car;
 	c->cdr = cdr;
 
-	struct alloc_list *item = malloc (sizeof (struct alloc_list));
+	struct alloc_list *item = malloc(sizeof(struct alloc_list));
 	item->type = T_CONS;
 	item->cons_val = c;
 
-	if ( last_a )
+	if (last_a)
 	{
 		item->prev = last_a;
 		last_a->next = item;
@@ -55,55 +55,55 @@
 	return v;
 }
 
-void skipws (struct istream *is)
+void skipws(struct istream *is)
 {
-	while ( isspace (is->peek (is)) )
-		is->get (is);
+	while (isspace(is->peek(is)))
+		is->get(is);
 }
 
-bool isallowedchar (char c)
+bool isallowedchar(char c)
 {
 	return (c >= '#' && c <= '\'') || (c >= '*' && c <= '/') ||
 	       (c >= '>' && c <= '@');
 }
 
-bool issymstart (char c)
+bool issymstart(char c)
 {
-	return isalpha (c) || isallowedchar (c);
+	return isalpha(c) || isallowedchar(c);
 }
 
-bool issym (char c)
+bool issym(char c)
 {
-	return isalpha (c) || isallowedchar (c) || isdigit (c);
+	return isalpha(c) || isallowedchar(c) || isdigit(c);
 }
 
-bool readsym (struct istream *is, value_t *val)
+bool readsym(struct istream *is, value_t *val)
 {
-	skipws (is);
+	skipws(is);
 
-	if ( !issymstart (is->peek (is)) )
+	if (!issymstart(is->peek(is)))
 		return false;
 
 	int size = 8;
-	char *s = malloc_aligned (size);
+	char *s = malloc_aligned(size);
 
-	s[ 0 ] = is->get (is);
+	s[0] = is->get(is);
 
-	for ( int i = 1;; i++ )
+	for (int i = 1;; i++)
 	{
-		if ( issym (is->peek (is)) )
+		if (issym(is->peek(is)))
 		{
-			if ( i >= size )
+			if (i >= size)
 			{
 				size *= 2;
-				s = realloc_aligned (s, size);
+				s = realloc_aligned(s, size);
 			}
 
-			s[ i ] = is->get (is);
+			s[i] = is->get(is);
 		}
 		else
 		{
-			s[ i ] = 0;
+			s[i] = 0;
 			*val = (value_t)s;
 			*val |= SYMBOL_TAG;
 
@@ -112,37 +112,37 @@
 	}
 }
 
-bool readstr (struct istream *is, value_t *val)
+bool readstr(struct istream *is, value_t *val)
 {
-	skipws (is);
+	skipws(is);
 
-	if ( is->peek (is) != '"' )
+	if (is->peek(is) != '"')
 		return false;
 
 	bool escape = false;
 	int size = 8;
-	char *s = malloc_aligned (size);
+	char *s = malloc_aligned(size);
 
-	(void)is->get (is);
+	(void)is->get(is);
 
-	for ( int i = 0;; i++ )
+	for (int i = 0;; i++)
 	{
-		if ( is->peek (is) != '"' )
+		if (is->peek(is) != '"')
 		{
-			if ( i >= size )
+			if (i >= size)
 			{
 				size *= 2;
-				s = realloc_aligned (s, size);
+				s = realloc_aligned(s, size);
 			}
 
-			char c = is->get (is);
+			char c = is->get(is);
 
-			if ( escape && c == 'n' )
+			if (escape && c == 'n')
 				c = '\n';
-			else if ( escape && c == '\\' )
+			else if (escape && c == '\\')
 				c = '\\';
 
-			if ( c == '\\' && !escape )
+			if (c == '\\' && !escape)
 			{
 				escape = true;
 				i--; // will be incremented again, UGLY.
@@ -150,12 +150,12 @@
 			else
 			{
 				escape = false;
-				s[ i ] = c;
+				s[i] = c;
 			}
 		}
 		else
 		{
-			is->get (is);
+			is->get(is);
 
 			*val = (value_t)s;
 			*val |= STRING_TAG;
@@ -165,118 +165,118 @@
 	}
 }
 
-void printval (value_t v, int depth)
+void printval(value_t v, int depth)
 {
-	for ( int i = 0; i < depth; i++ )
-		printf ("  ");
+	for (int i = 0; i < depth; i++)
+		printf("  ");
 
-	if ( symbolp (v) )
+	if (symbolp(v))
 	{
-		printf ("'%s\n", (char *)(v ^ SYMBOL_TAG));
+		printf("'%s\n", (char *)(v ^ SYMBOL_TAG));
 	}
-	else if ( stringp (v) )
+	else if (stringp(v))
 	{
-		printf ("\"%s\"\n", (char *)(v ^ STRING_TAG));
+		printf("\"%s\"\n", (char *)(v ^ STRING_TAG));
 	}
-	else if ( integerp (v) )
+	else if (integerp(v))
 	{
-		printf ("%d\n", v >> 2);
+		printf("%d\n", v >> 2);
 	}
-	else if ( consp (v) )
+	else if (consp(v))
 	{
-		if ( listp (v) )
+		if (listp(v))
 		{
-			printf ("list:\n");
+			printf("list:\n");
 
-			for ( value_t n = v; !nilp (n); n = cdr (n) )
+			for (value_t n = v; !nilp(n); n = cdr(n))
 			{
-				printval (car (n), depth + 1);
+				printval(car(n), depth + 1);
 			}
 		}
 		else
 		{
-			printf ("cons:\n");
-			printval (car (v), depth + 1);
-			printval (cdr (v), depth + 1);
+			printf("cons:\n");
+			printval(car(v), depth + 1);
+			printval(cdr(v), depth + 1);
 		}
 	}
-	else if ( nilp (v) )
+	else if (nilp(v))
 	{
-		printf ("nil\n");
+		printf("nil\n");
 	}
 	else
 	{
-		printf ("<unknown %d>\n", v);
+		printf("<unknown %d>\n", v);
 	}
 }
 
-bool readlist (struct istream *is, value_t *val)
+bool readlist(struct istream *is, value_t *val)
 {
-	skipws (is);
+	skipws(is);
 
-	if ( is->peek (is) != '(' )
+	if (is->peek(is) != '(')
 		return false;
 
-	is->get (is);
+	is->get(is);
 
-	*val = readn (is);
+	*val = readn(is);
 
-	if ( is->peek (is) != ')' )
+	if (is->peek(is) != ')')
 	{
-		is->showpos (is, stderr);
-		err ("Unterminated list");
+		is->showpos(is, stderr);
+		err("Unterminated list");
 		return false;
 	}
-	is->get (is);
+	is->get(is);
 
 	return true;
 }
 
-bool readint (struct istream *is, value_t *val)
+bool readint(struct istream *is, value_t *val)
 {
 	int number = 0;
 
-	if ( !isdigit (is->peek (is)) )
+	if (!isdigit(is->peek(is)))
 		return false;
 
-	while ( isdigit (is->peek (is)) )
+	while (isdigit(is->peek(is)))
 	{
 		number *= 10;
-		number += is->get (is) - '0';
+		number += is->get(is) - '0';
 	}
 
-	*val = intval (number);
+	*val = intval(number);
 	return true;
 }
 
-bool read1 (struct istream *is, value_t *val)
+bool read1(struct istream *is, value_t *val)
 {
-	if ( readsym (is, val) )
+	if (readsym(is, val))
 		return true;
 
-	if ( readstr (is, val) )
+	if (readstr(is, val))
 		return true;
 
-	if ( readint (is, val) )
+	if (readint(is, val))
 		return true;
 
-	if ( readlist (is, val) )
+	if (readlist(is, val))
 		return true;
 
 	return false;
 }
 
-value_t readn (struct istream *is)
+value_t readn(struct istream *is)
 {
 	value_t first = nil;
 	value_t *last = &first;
 
 	value_t read_val;
 
-	while ( read1 (is, &read_val) )
+	while (read1(is, &read_val))
 	{
-		*last = cons (read_val, nil);
-		last = cdrref (*last);
+		*last = cons(read_val, nil);
+		last = cdrref(*last);
 	}
 
 	return first;
@@ -292,27 +292,27 @@
 	int linestart;
 };
 
-int stristream_peek (struct istream *is)
+int stristream_peek(struct istream *is)
 {
 	struct stristream_private *p = is->data;
 
-	if ( p->i < p->length )
-		return p->val[ p->i ];
+	if (p->i < p->length)
+		return p->val[p->i];
 	else
 		return -1;
 }
 
-int stristream_get (struct istream *is)
+int stristream_get(struct istream *is)
 {
 	struct stristream_private *p = is->data;
 
-	if ( p->i < p->length )
+	if (p->i < p->length)
 	{
-		char c = p->val[ p->i++ ];
+		char c = p->val[p->i++];
 
 		p->fromleft++;
 
-		if ( c == '\n' )
+		if (c == '\n')
 		{
 			p->fromleft = 1;
 			p->line++;
@@ -325,46 +325,46 @@
 		return -1;
 }
 
-int stristream_read (struct istream *s, char *buffer, int size)
+int stristream_read(struct istream *s, char *buffer, int size)
 {
 	struct stristream_private *p = s->data;
 
-	int len = MIN (size, p->length - p->i);
-	memcpy (buffer, p->val, len);
+	int len = MIN(size, p->length - p->i);
+	memcpy(buffer, p->val, len);
 	return len;
 }
 
-void stristream_showpos (struct istream *s, FILE *out)
+void stristream_showpos(struct istream *s, FILE *out)
 {
 	struct stristream_private *p = s->data;
 
-	fprintf (out, "line: %d, char %d\n", p->line, p->fromleft);
+	fprintf(out, "line: %d, char %d\n", p->line, p->fromleft);
 
 	int end = p->length;
 
-	for ( int i = p->linestart; i < p->length; i++ )
+	for (int i = p->linestart; i < p->length; i++)
 	{
-		if ( p->val[ i ] == '\n' )
+		if (p->val[i] == '\n')
 		{
 			end = i;
 			break;
 		}
 	}
 
-	fprintf (out, "  | %.*s\n", end - p->linestart, p->val + p->linestart);
-	fprintf (out, "  | ");
-	for ( int i = 0; i < p->fromleft - 1; i++ )
-		fprintf (out, " ");
+	fprintf(out, "  | %.*s\n", end - p->linestart, p->val + p->linestart);
+	fprintf(out, "  | ");
+	for (int i = 0; i < p->fromleft - 1; i++)
+		fprintf(out, " ");
 
-	fprintf (out, "\033[31m^\033[0m\n");
+	fprintf(out, "\033[31m^\033[0m\n");
 }
 
-struct istream *new_stristream (char *str, int length)
+struct istream *new_stristream(char *str, int length)
 {
-	struct istream *is = malloc (sizeof (struct istream));
-	struct stristream_private *p = malloc (sizeof (struct stristream_private));
+	struct istream *is = malloc(sizeof(struct istream));
+	struct stristream_private *p = malloc(sizeof(struct stristream_private));
 
-	p->val = strndup (str, length);
+	p->val = strndup(str, length);
 	p->i = 0;
 	p->length = length;
 	p->line = 1;
@@ -380,136 +380,136 @@
 	return is;
 }
 
-void del_stristream (struct istream *stristream)
+void del_stristream(struct istream *stristream)
 {
 	struct stristream_private *p = stristream->data;
-	free (p->val);
-	free (p);
-	free (stristream);
+	free(p->val);
+	free(p);
+	free(stristream);
 }
 
-struct istream *new_stristream_nt (char *str)
+struct istream *new_stristream_nt(char *str)
 {
-	return new_stristream (str, strlen (str));
+	return new_stristream(str, strlen(str));
 }
 
-bool startswith (struct istream *s, char *pattern)
+bool startswith(struct istream *s, char *pattern)
 {
-	char *check = strdup (pattern);
-	s->read (s, check, strlen (pattern));
+	char *check = strdup(pattern);
+	s->read(s, check, strlen(pattern));
 
-	bool res = strcmp (check, pattern) == 0;
-	free (check);
+	bool res = strcmp(check, pattern) == 0;
+	free(check);
 
 	return res;
 }
 
-value_t strval (char *str)
+value_t strval(char *str)
 {
 	value_t v;
 
-	char *a = malloc_aligned (strlen (str) + 1);
+	char *a = malloc_aligned(strlen(str) + 1);
 	v = (value_t)a;
 	v |= STRING_TAG;
 
 	return v;
 }
 
-bool integerp (value_t v)
+bool integerp(value_t v)
 {
 	return (v & INT_MASK) == INT_TAG;
 }
 
-bool symbolp (value_t v)
+bool symbolp(value_t v)
 {
 	return (v & HEAP_MASK) == SYMBOL_TAG;
 }
 
-bool stringp (value_t v)
+bool stringp(value_t v)
 {
 	return (v & HEAP_MASK) == STRING_TAG;
 }
 
-bool consp (value_t v)
+bool consp(value_t v)
 {
 	return (v & HEAP_MASK) == CONS_TAG;
 }
 
-bool listp (value_t v)
+bool listp(value_t v)
 {
 	value_t next = v;
 
-	while ( consp (next) )
+	while (consp(next))
 	{
-		next = cdr (next);
+		next = cdr(next);
 	}
 
-	return nilp (next);
+	return nilp(next);
 }
 
-value_t car (value_t v)
+value_t car(value_t v)
 {
-	if ( !consp (v) )
+	if (!consp(v))
 		return nil;
 
-	return *carref (v);
+	return *carref(v);
 }
 
-value_t cdr (value_t v)
+value_t cdr(value_t v)
 {
-	if ( !consp (v) )
+	if (!consp(v))
 		return nil;
 
-	return *cdrref (v);
+	return *cdrref(v);
 }
 
-value_t *carref (value_t v)
+value_t *carref(value_t v)
 {
-	if ( !consp (v) )
+	if (!consp(v))
 		return NULL;
 
 	struct cons *c = (void *)(v ^ CONS_TAG);
 	return &c->car;
 }
 
-value_t *cdrref (value_t v)
+value_t *cdrref(value_t v)
 {
-	if ( !consp (v) )
+	if (!consp(v))
 		return NULL;
 
 	struct cons *c = (void *)(v ^ CONS_TAG);
 	return &c->cdr;
 }
 
-bool nilp (value_t v)
+bool nilp(value_t v)
 {
 	return v == nil;
 }
 
-int length (value_t v)
+int length(value_t v)
 {
 	int i = 0;
 
-	for ( ; !nilp (v); v = cdr (v) )
+	for (; !nilp(v); v = cdr(v))
 		i++;
 
 	return i;
 }
 
-value_t elt (value_t v, int index)
+value_t elt(value_t v, int index)
 {
-	for ( int i = 0; i < index; i++ )
+	for (int i = 0; i < index; i++)
 	{
-		v = cdr (v);
+		v = cdr(v);
 	}
 
-	return car (v);
+	return car(v);
 }
 
-bool symstreq (value_t sym, char *str)
+bool symstreq(value_t sym, char *str)
 {
-	if ( (sym & HEAP_MASK) != SYMBOL_TAG )
+	if ((sym & HEAP_MASK) != SYMBOL_TAG)
 		return false;
 
-	return strcmp ((char *) (sym ^ SYMBOL_TAG), str) == 0;
+	return strcmp((char *)(sym ^ SYMBOL_TAG), str) == 0;
 }
diff --git a/src/lisp/lisp.h b/src/lisp/lisp.h
index ba69a87..d3a0a29 100644
--- a/src/lisp/lisp.h
+++ b/src/lisp/lisp.h
@@ -57,51 +57,51 @@
 	void *data;
 
 	// These two return -1 on error
-	int (*peek) (struct istream *s);
-	int (*get) (struct istream *s);
+	int (*peek)(struct istream *s);
+	int (*get)(struct istream *s);
 
-	int (*read) (struct istream *s, char *buffer, int size);
+	int (*read)(struct istream *s, char *buffer, int size);
 
-	void (*showpos) (struct istream *s, FILE *out);
+	void (*showpos)(struct istream *s, FILE *out);
 };
 
-bool startswith (struct istream *s, char *pattern);
+bool startswith(struct istream *s, char *pattern);
 
-bool readsym (struct istream *is, value_t *val);
-bool readstr (struct istream *is, value_t *val);
-bool readlist (struct istream *is, value_t *val);
-bool readint (struct istream *is, value_t *val);
+bool readsym(struct istream *is, value_t *val);
+bool readstr(struct istream *is, value_t *val);
+bool readlist(struct istream *is, value_t *val);
+bool readint(struct istream *is, value_t *val);
 
-value_t intval (int i);
-value_t strval (char *str);
-value_t cons (value_t car, value_t cdr);
-bool read1 (struct istream *is, value_t *val);
-value_t read (struct istream *is);
-value_t readn (struct istream *is);
+value_t intval(int i);
+value_t strval(char *str);
+value_t cons(value_t car, value_t cdr);
+bool read1(struct istream *is, value_t *val);
+value_t read(struct istream *is);
+value_t readn(struct istream *is);
 
-value_t car (value_t v);
-value_t cdr (value_t v);
-value_t *carref (value_t v);
-value_t *cdrref (value_t v);
+value_t car(value_t v);
+value_t cdr(value_t v);
+value_t *carref(value_t v);
+value_t *cdrref(value_t v);
 
-bool integerp (value_t v);
-bool symbolp (value_t v);
-bool stringp (value_t v);
-bool consp (value_t v);
-bool listp (value_t v);
-bool nilp (value_t v);
-int length (value_t v);
-value_t elt (value_t v, int index);
+bool integerp(value_t v);
+bool symbolp(value_t v);
+bool stringp(value_t v);
+bool consp(value_t v);
+bool listp(value_t v);
+bool nilp(value_t v);
+int length(value_t v);
+value_t elt(value_t v, int index);
 
-void printval (value_t v, int depth);
+void printval(value_t v, int depth);
 
-struct istream *new_stristream (char *str, int length);
+struct istream *new_stristream(char *str, int length);
 // same as above but null terminated
-struct istream *new_stristream_nt (char *str);
-void del_stristream (struct istream *stristream);
+struct istream *new_stristream_nt(char *str);
+void del_stristream(struct istream *stristream);
 
-void err (const char *msg);
+void err(const char *msg);
 
-bool symstreq (value_t sym, char *str);
+bool symstreq(value_t sym, char *str);
 
 extern value_t nil;
diff --git a/src/lisp/main.c b/src/lisp/main.c
index 5c217fc..5679572 100644
--- a/src/lisp/main.c
+++ b/src/lisp/main.c
@@ -1,19 +1,19 @@
-#include "lisp.h"
 #include "compiler.h"
+#include "lisp.h"
 
-int main (int argc, char **argv)
+int main(int argc, char **argv)
 {
-	if ( argc < 2 )
+	if (argc < 2)
 	{
-		puts ("pass the string you want to parse as the first argument please");
+		puts("pass the string you want to parse as the first argument please");
 		return 1;
 	}
 
-	struct istream *is = new_stristream_nt (argv[ 1 ]);
+	struct istream *is = new_stristream_nt(argv[1]);
 
-	struct environment env = compile_all (is);
-	value_t (*lisp_main) () = find_function(&env, "main")->def0;
-	lisp_main ();
+	struct environment env = compile_all(is);
+	value_t (*lisp_main)() = find_function(&env, "main")->def0;
+	lisp_main();
 
-//	del_stristream (is);
+	//	del_stristream (is);
 }
diff --git a/src/lisp/plat/linux.c b/src/lisp/plat/linux.c
index bd9af10..83cc39b 100644
--- a/src/lisp/plat/linux.c
+++ b/src/lisp/plat/linux.c
@@ -3,41 +3,42 @@
 #include <string.h>
 #include <sys/mman.h>
 
-void *malloc_aligned (size_t size)
+void *malloc_aligned(size_t size)
 {
-	void *mem = malloc (size + 8 + sizeof (void *) * 2);
-	void **aligned_ptr = (void **) ((uintptr_t) (mem + 8 + sizeof (void *)) & ~7);
-	aligned_ptr[ -1 ] = mem;
-	aligned_ptr[ -2 ] = (void *) size;
+	void *mem = malloc(size + 8 + sizeof(void *) * 2);
+	void **aligned_ptr = (void **)((uintptr_t)(mem + 8 + sizeof(void *)) & ~7);
+	aligned_ptr[-1] = mem;
+	aligned_ptr[-2] = (void *)size;
 	return aligned_ptr;
 }
 
-void *realloc_aligned (void *addr, size_t size)
+void *realloc_aligned(void *addr, size_t size)
 {
-	void *mem = malloc (size + 8 + sizeof (void *) * 2);
-	void **aligned_ptr = (void **) ((uintptr_t) (mem + 8 + sizeof (void *)) & ~7);
-	aligned_ptr[ -1 ] = mem;
+	void *mem = malloc(size + 8 + sizeof(void *) * 2);
+	void **aligned_ptr = (void **)((uintptr_t)(mem + 8 + sizeof(void *)) & ~7);
+	aligned_ptr[-1] = mem;
 
-	memcpy (aligned_ptr, addr, (uintptr_t) aligned_ptr[ -2 ]);
-	
+	memcpy(aligned_ptr, addr, (uintptr_t)aligned_ptr[-2]);
+
 	return aligned_ptr;
 }
 
-void free_aligned (void *addr)
+void free_aligned(void *addr)
 {
 	void **ptr = (void **)addr;
-	free (ptr[ -1 ]);
+	free(ptr[-1]);
 }
 
-void *link (dasm_State **Dst)
+void *link(dasm_State **Dst)
 {
 	size_t size;
 	void *buf;
 
-	dasm_link (Dst, &size);
-	buf = mmap (0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
-	dasm_encode (Dst, buf);
+	dasm_link(Dst, &size);
+	buf = mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1,
+	           0);
+	dasm_encode(Dst, buf);
 
-	mprotect (buf, size, PROT_READ | PROT_EXEC);
+	mprotect(buf, size, PROT_READ | PROT_EXEC);
 	return buf;
 }
diff --git a/src/lisp/plat/plat.h b/src/lisp/plat/plat.h
index 87544ba..f10676c 100644
--- a/src/lisp/plat/plat.h
+++ b/src/lisp/plat/plat.h
@@ -1,14 +1,14 @@
 #pragma once
 
-#include <stdint.h>
-#include <stddef.h>
 #include <dasm_proto.h>
+#include <stddef.h>
+#include <stdint.h>
 
 /* Platform specific definitions */
 
 // Must return an address aligned to 8 bytes
-void *malloc_aligned (size_t size);
-void *realloc_aligned (void *addr, size_t size);
-void free_aligned (void *addr);
+void *malloc_aligned(size_t size);
+void *realloc_aligned(void *addr, size_t size);
+void free_aligned(void *addr);
 
-void *link (dasm_State **Dst);
+void *link(dasm_State **Dst);
diff --git a/src/lisp/test.lisp b/src/lisp/test.lisp
index 68cc615..82e5955 100644
--- a/src/lisp/test.lisp
+++ b/src/lisp/test.lisp
@@ -3,4 +3,5 @@
 
 (defun main ()
   (print "64 / (2 + 2) =")
-  (print (/ 64 (two-plus-two))))
+  (print (/ 64 (two-plus-two)))
+  (print nil))