Compiler can compile simple nested expressions and function calls.

The generated code can be called from C, and values can be passed between.
diff --git a/src/lisp/plat/linux.c b/src/lisp/plat/linux.c
index 23f7f82..bd9af10 100644
--- a/src/lisp/plat/linux.c
+++ b/src/lisp/plat/linux.c
@@ -1,6 +1,7 @@
 #include "plat.h"
 #include <stdlib.h>
 #include <string.h>
+#include <sys/mman.h>
 
 void *malloc_aligned (size_t size)
 {
@@ -27,3 +28,16 @@
 	void **ptr = (void **)addr;
 	free (ptr[ -1 ]);
 }
+
+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);
+
+	mprotect (buf, size, PROT_READ | PROT_EXEC);
+	return buf;
+}
diff --git a/src/lisp/plat/plat.h b/src/lisp/plat/plat.h
index 227e0d2..87544ba 100644
--- a/src/lisp/plat/plat.h
+++ b/src/lisp/plat/plat.h
@@ -2,6 +2,7 @@
 
 #include <stdint.h>
 #include <stddef.h>
+#include <dasm_proto.h>
 
 /* Platform specific definitions */
 
@@ -9,3 +10,5 @@
 void *malloc_aligned (size_t size);
 void *realloc_aligned (void *addr, size_t size);
 void free_aligned (void *addr);
+
+void *link (dasm_State **Dst);