Add backquote/quasiquote (`).
diff --git a/src/lisp/compiler.dasc b/src/lisp/compiler.dasc
index bf78a20..f176b7d 100644
--- a/src/lisp/compiler.dasc
+++ b/src/lisp/compiler.dasc
@@ -370,9 +370,34 @@
 	else
 	{
 		value_t fsym = car(val), args = cdr(val);
-		int nargs = length(args);
+		int nargs = length(args),
+			n = length(val);
 
-		// TODO
+		if (symstreq(fsym, "unquote"))
+		{
+			if (nargs != 1)
+			{
+				err_at(val, "unquote (or ,) takes exactly 1 argument");
+			}
+
+			compile_expression(env, local, car(args), false, Dst);
+		}
+		else
+		{
+			| push nil;
+
+			for (int i = n - 1; i >= 0; i--)
+			{
+				compile_backquote(env, local, elt(val, i), Dst);
+				| push eax;
+				| call_extern cons;
+				| add esp, 8;
+
+				// Remove unnecessary pop
+				| push eax;
+			}
+				| pop eax;
+		}
 	}
 }
 
@@ -552,17 +577,12 @@
 			{
 				compile_expression(env, local, elt(args, i), false, Dst);
 
-				// push the ith item
 				| push eax;
-				// cons the top two stack items
 				| call_extern cons;
-				// remove the stack items from use
 				| add esp, (2 * value_size);
-				// put the new thing on the stack
 				| push eax;
 			}
-
-			| pop eax;
+				| pop eax;
 		}
 		else if (symstreq(fsym, "lambda"))
 		{