diff --git a/Doxyfile b/Doxyfile
index b94ec20..955cb32 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -32,13 +32,13 @@ DOXYFILE_ENCODING      = UTF-8
 # title of most generated pages and in a few other places.
 # The default value is: My Project.
 
-PROJECT_NAME           = "\"Post Scarcity\""
+PROJECT_NAME           = "Post Scarcity"
 
 # The PROJECT_NUMBER tag can be used to enter a project or revision number. This
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 
+PROJECT_NUMBER         =
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
@@ -51,14 +51,14 @@ PROJECT_BRIEF          = "A prototype for a post scarcity programming environmen
 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
 # the logo to the output directory.
 
-PROJECT_LOGO           = 
+PROJECT_LOGO           =
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
 # into which the generated documentation will be written. If a relative path is
 # entered, it will be relative to the location where doxygen was started. If
 # left blank the current directory will be used.
 
-OUTPUT_DIRECTORY       = /home/simon/workspace/post-scarcity/doc
+OUTPUT_DIRECTORY       = doc
 
 # If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
 # directories (in 2 levels) under the output directory of each output format and
@@ -162,7 +162,7 @@ FULL_PATH_NAMES        = YES
 # will be relative from the directory where doxygen is started.
 # This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
-STRIP_FROM_PATH        = 
+STRIP_FROM_PATH        =
 
 # The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
 # path mentioned in the documentation of a class, which tells the reader which
@@ -171,7 +171,7 @@ STRIP_FROM_PATH        =
 # specify the list of include paths that are normally passed to the compiler
 # using the -I flag.
 
-STRIP_FROM_INC_PATH    = 
+STRIP_FROM_INC_PATH    =
 
 # If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
 # less readable) file names. This can be useful is your file systems doesn't
@@ -238,13 +238,13 @@ TAB_SIZE               = 4
 # "Side Effects:". You can put \n's in the value part of an alias to insert
 # newlines.
 
-ALIASES                = 
+ALIASES                =
 
 # This tag can be used to specify a number of word-keyword mappings (TCL only).
 # A mapping has the form "name=value". For example adding "class=itcl::class"
 # will allow you to use the command class in the itcl::class meaning.
 
-TCL_SUBST              = 
+TCL_SUBST              =
 
 # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
 # only. Doxygen will then generate output that is more tailored for C. For
@@ -291,7 +291,7 @@ OPTIMIZE_OUTPUT_VHDL   = NO
 # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
 # the files are not read by doxygen.
 
-EXTENSION_MAPPING      = 
+EXTENSION_MAPPING      =
 
 # If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
 # according to the Markdown format, which allows for more readable
@@ -648,7 +648,7 @@ GENERATE_DEPRECATEDLIST= YES
 # sections, marked by \if <section_label> ... \endif and \cond <section_label>
 # ... \endcond blocks.
 
-ENABLED_SECTIONS       = 
+ENABLED_SECTIONS       =
 
 # The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
 # initial value of a variable or macro / define can have for it to appear in the
@@ -690,7 +690,7 @@ SHOW_NAMESPACES        = YES
 # by doxygen. Whatever the program writes to standard output is used as the file
 # version. For an example see the documentation.
 
-FILE_VERSION_FILTER    = 
+FILE_VERSION_FILTER    =
 
 # The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
 # by doxygen. The layout file controls the global structure of the generated
@@ -703,7 +703,7 @@ FILE_VERSION_FILTER    =
 # DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
 # tag is left empty.
 
-LAYOUT_FILE            = 
+LAYOUT_FILE            =
 
 # The CITE_BIB_FILES tag can be used to specify one or more bib files containing
 # the reference definitions. This must be a list of .bib files. The .bib
@@ -713,7 +713,7 @@ LAYOUT_FILE            =
 # LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
 # search path. See also \cite for info how to create references.
 
-CITE_BIB_FILES         = 
+CITE_BIB_FILES         =
 
 #---------------------------------------------------------------------------
 # Configuration options related to warning and progress messages
@@ -778,7 +778,7 @@ WARN_FORMAT            = "$file:$line: $text"
 # messages should be written. If left blank the output is written to standard
 # error (stderr).
 
-WARN_LOGFILE           = 
+WARN_LOGFILE           = doxy.log
 
 #---------------------------------------------------------------------------
 # Configuration options related to the input files
@@ -790,7 +790,7 @@ WARN_LOGFILE           =
 # spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
 # Note: If this tag is empty the current directory is searched.
 
-INPUT                  = /home/simon/workspace/post-scarcity/src
+INPUT                  = src src/arith src/memory src/ops
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
@@ -873,7 +873,7 @@ RECURSIVE              = NO
 # Note that relative paths are relative to the directory from which doxygen is
 # run.
 
-EXCLUDE                = 
+EXCLUDE                =
 
 # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
 # directories that are symbolic links (a Unix file system feature) are excluded
@@ -889,7 +889,7 @@ EXCLUDE_SYMLINKS       = NO
 # Note that the wildcards are matched against the file with absolute path, so to
 # exclude all test directories for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = 
+EXCLUDE_PATTERNS       =
 
 # The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
 # (namespaces, classes, functions, etc.) that should be excluded from the
@@ -900,13 +900,13 @@ EXCLUDE_PATTERNS       =
 # Note that the wildcards are matched against the file with absolute path, so to
 # exclude all test directories use the pattern */test/*
 
-EXCLUDE_SYMBOLS        = 
+EXCLUDE_SYMBOLS        =
 
 # The EXAMPLE_PATH tag can be used to specify one or more files or directories
 # that contain example code fragments that are included (see the \include
 # command).
 
-EXAMPLE_PATH           = 
+EXAMPLE_PATH           =
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
@@ -926,7 +926,7 @@ EXAMPLE_RECURSIVE      = NO
 # that contain images that are to be included in the documentation (see the
 # \image command).
 
-IMAGE_PATH             = 
+IMAGE_PATH             =
 
 # The INPUT_FILTER tag can be used to specify a program that doxygen should
 # invoke to filter for each input file. Doxygen will invoke the filter program
@@ -947,7 +947,7 @@ IMAGE_PATH             =
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
 # properly processed by doxygen.
 
-INPUT_FILTER           = 
+INPUT_FILTER           =
 
 # The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
 # basis. Doxygen will compare the file name with each pattern and apply the
@@ -960,7 +960,7 @@ INPUT_FILTER           =
 # need to set EXTENSION_MAPPING for the extension otherwise the files are not
 # properly processed by doxygen.
 
-FILTER_PATTERNS        = 
+FILTER_PATTERNS        =
 
 # If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
 # INPUT_FILTER) will also be used to filter the input files that are used for
@@ -975,14 +975,14 @@ FILTER_SOURCE_FILES    = NO
 # *.ext= (so without naming a filter).
 # This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
 
-FILTER_SOURCE_PATTERNS = 
+FILTER_SOURCE_PATTERNS =
 
 # If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
 # is part of the input, its contents will be placed on the main page
 # (index.html). This can be useful if you have a project on for instance GitHub
 # and want to reuse the introduction page also for the doxygen output.
 
-USE_MDFILE_AS_MAINPAGE = 
+USE_MDFILE_AS_MAINPAGE =
 
 #---------------------------------------------------------------------------
 # Configuration options related to source browsing
@@ -1087,7 +1087,7 @@ CLANG_ASSISTED_PARSING = NO
 # specified with INPUT and INCLUDE_PATH.
 # This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
 
-CLANG_OPTIONS          = 
+CLANG_OPTIONS          =
 
 #---------------------------------------------------------------------------
 # Configuration options related to the alphabetical class index
@@ -1113,7 +1113,7 @@ COLS_IN_ALPHA_INDEX    = 5
 # while generating the index headers.
 # This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
-IGNORE_PREFIX          = 
+IGNORE_PREFIX          =
 
 #---------------------------------------------------------------------------
 # Configuration options related to the HTML output
@@ -1157,7 +1157,7 @@ HTML_FILE_EXTENSION    = .html
 # of the possible markers and block names see the documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_HEADER            = 
+HTML_HEADER            =
 
 # The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
 # generated HTML page. If the tag is left blank doxygen will generate a standard
@@ -1167,7 +1167,7 @@ HTML_HEADER            =
 # that doxygen normally uses.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_FOOTER            = 
+HTML_FOOTER            =
 
 # The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
 # sheet that is used by each HTML page. It can be used to fine-tune the look of
@@ -1179,7 +1179,7 @@ HTML_FOOTER            =
 # obsolete.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_STYLESHEET        = 
+HTML_STYLESHEET        =
 
 # The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
 # cascading style sheets that are included after the standard style sheets
@@ -1192,7 +1192,7 @@ HTML_STYLESHEET        =
 # list). For an example see the documentation.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_EXTRA_STYLESHEET  = 
+HTML_EXTRA_STYLESHEET  =
 
 # The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
 # other source files which should be copied to the HTML output directory. Note
@@ -1202,7 +1202,7 @@ HTML_EXTRA_STYLESHEET  =
 # files will be copied as-is; there are no commands or markers available.
 # This tag requires that the tag GENERATE_HTML is set to YES.
 
-HTML_EXTRA_FILES       = 
+HTML_EXTRA_FILES       =
 
 # The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
 # will adjust the colors in the style sheet and background images according to
@@ -1331,7 +1331,7 @@ GENERATE_HTMLHELP      = NO
 # written to the html output directory.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-CHM_FILE               = 
+CHM_FILE               =
 
 # The HHC_LOCATION tag can be used to specify the location (absolute path
 # including file name) of the HTML help compiler (hhc.exe). If non-empty,
@@ -1339,7 +1339,7 @@ CHM_FILE               =
 # The file has to be specified with full path.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HHC_LOCATION           = 
+HHC_LOCATION           =
 
 # The GENERATE_CHI flag controls if a separate .chi index file is generated
 # (YES) or that it should be included in the master .chm file (NO).
@@ -1352,7 +1352,7 @@ GENERATE_CHI           = NO
 # and project file content.
 # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-CHM_INDEX_ENCODING     = 
+CHM_INDEX_ENCODING     =
 
 # The BINARY_TOC flag controls whether a binary table of contents is generated
 # (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
@@ -1383,7 +1383,7 @@ GENERATE_QHP           = NO
 # the HTML output folder.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
-QCH_FILE               = 
+QCH_FILE               =
 
 # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
 # Project output. For more information please see Qt Help Project / Namespace
@@ -1408,7 +1408,7 @@ QHP_VIRTUAL_FOLDER     = doc
 # filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHP_CUST_FILTER_NAME   = 
+QHP_CUST_FILTER_NAME   =
 
 # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
 # custom filter to add. For more information please see Qt Help Project / Custom
@@ -1416,21 +1416,21 @@ QHP_CUST_FILTER_NAME   =
 # filters).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHP_CUST_FILTER_ATTRS  = 
+QHP_CUST_FILTER_ATTRS  =
 
 # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
 # project's filter section matches. Qt Help Project / Filter Attributes (see:
 # http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHP_SECT_FILTER_ATTRS  = 
+QHP_SECT_FILTER_ATTRS  =
 
 # The QHG_LOCATION tag can be used to specify the location of Qt's
 # qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
 # generated .qhp file.
 # This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHG_LOCATION           = 
+QHG_LOCATION           =
 
 # If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
 # generated, together with the HTML files, they form an Eclipse help plugin. To
@@ -1563,7 +1563,7 @@ MATHJAX_RELPATH        = http://cdn.mathjax.org/mathjax/latest
 # MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
-MATHJAX_EXTENSIONS     = 
+MATHJAX_EXTENSIONS     =
 
 # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
 # of code that will be used on startup of the MathJax code. See the MathJax site
@@ -1571,7 +1571,7 @@ MATHJAX_EXTENSIONS     =
 # example see the documentation.
 # This tag requires that the tag USE_MATHJAX is set to YES.
 
-MATHJAX_CODEFILE       = 
+MATHJAX_CODEFILE       =
 
 # When the SEARCHENGINE tag is enabled doxygen will generate a search box for
 # the HTML output. The underlying search engine uses javascript and DHTML and
@@ -1631,7 +1631,7 @@ EXTERNAL_SEARCH        = NO
 # Searching" for details.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
-SEARCHENGINE_URL       = 
+SEARCHENGINE_URL       =
 
 # When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
 # search data is written to a file for indexing by an external tool. With the
@@ -1647,7 +1647,7 @@ SEARCHDATA_FILE        = searchdata.xml
 # projects and redirect the results back to the right project.
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
-EXTERNAL_SEARCH_ID     = 
+EXTERNAL_SEARCH_ID     =
 
 # The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
 # projects other than the one defined by this configuration file, but that are
@@ -1657,7 +1657,7 @@ EXTERNAL_SEARCH_ID     =
 # EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
 # This tag requires that the tag SEARCHENGINE is set to YES.
 
-EXTRA_SEARCH_MAPPINGS  = 
+EXTRA_SEARCH_MAPPINGS  =
 
 #---------------------------------------------------------------------------
 # Configuration options related to the LaTeX output
@@ -1721,7 +1721,7 @@ PAPER_TYPE             = a4
 # If left blank no extra packages will be included.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-EXTRA_PACKAGES         = 
+EXTRA_PACKAGES         =
 
 # The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
 # generated LaTeX document. The header should contain everything until the first
@@ -1737,7 +1737,7 @@ EXTRA_PACKAGES         =
 # to HTML_HEADER.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_HEADER           = 
+LATEX_HEADER           =
 
 # The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
 # generated LaTeX document. The footer should contain everything after the last
@@ -1748,7 +1748,7 @@ LATEX_HEADER           =
 # Note: Only use a user-defined footer if you know what you are doing!
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_FOOTER           = 
+LATEX_FOOTER           =
 
 # The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
 # LaTeX style sheets that are included after the standard style sheets created
@@ -1759,7 +1759,7 @@ LATEX_FOOTER           =
 # list).
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_EXTRA_STYLESHEET = 
+LATEX_EXTRA_STYLESHEET =
 
 # The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
 # other source files which should be copied to the LATEX_OUTPUT output
@@ -1767,7 +1767,7 @@ LATEX_EXTRA_STYLESHEET =
 # markers available.
 # This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_EXTRA_FILES      = 
+LATEX_EXTRA_FILES      =
 
 # If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
 # prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
@@ -1875,14 +1875,14 @@ RTF_HYPERLINKS         = NO
 # default style sheet that doxygen normally uses.
 # This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_STYLESHEET_FILE    = 
+RTF_STYLESHEET_FILE    =
 
 # Set optional variables used in the generation of an RTF document. Syntax is
 # similar to doxygen's config file. A template extensions file can be generated
 # using doxygen -e rtf extensionFile.
 # This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_EXTENSIONS_FILE    = 
+RTF_EXTENSIONS_FILE    =
 
 # If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
 # with syntax highlighting in the RTF output.
@@ -1927,7 +1927,7 @@ MAN_EXTENSION          = .3
 # MAN_EXTENSION with the initial . removed.
 # This tag requires that the tag GENERATE_MAN is set to YES.
 
-MAN_SUBDIR             = 
+MAN_SUBDIR             =
 
 # If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
 # will generate one additional man file for each entity documented in the real
@@ -2040,7 +2040,7 @@ PERLMOD_PRETTY         = YES
 # overwrite each other's variables.
 # This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
-PERLMOD_MAKEVAR_PREFIX = 
+PERLMOD_MAKEVAR_PREFIX =
 
 #---------------------------------------------------------------------------
 # Configuration options related to the preprocessor
@@ -2081,7 +2081,7 @@ SEARCH_INCLUDES        = YES
 # preprocessor.
 # This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
-INCLUDE_PATH           = 
+INCLUDE_PATH           =
 
 # You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
 # patterns (like *.h and *.hpp) to filter out the header-files in the
@@ -2089,7 +2089,7 @@ INCLUDE_PATH           =
 # used.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-INCLUDE_FILE_PATTERNS  = 
+INCLUDE_FILE_PATTERNS  =
 
 # The PREDEFINED tag can be used to specify one or more macro names that are
 # defined before the preprocessor is started (similar to the -D option of e.g.
@@ -2099,7 +2099,7 @@ INCLUDE_FILE_PATTERNS  =
 # recursively expanded use the := operator instead of the = operator.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             = 
+PREDEFINED             =
 
 # If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
 # tag can be used to specify a list of macro names that should be expanded. The
@@ -2108,7 +2108,7 @@ PREDEFINED             =
 # definition found in the source code.
 # This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-EXPAND_AS_DEFINED      = 
+EXPAND_AS_DEFINED      =
 
 # If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
 # remove all references to function-like macros that are alone on a line, have
@@ -2137,13 +2137,13 @@ SKIP_FUNCTION_MACROS   = YES
 # the path). If a tag file is not located in the directory in which doxygen is
 # run, you must also specify the path to the tagfile here.
 
-TAGFILES               = 
+TAGFILES               =
 
 # When a file name is specified after GENERATE_TAGFILE, doxygen will create a
 # tag file that is based on the input files it reads. See section "Linking to
 # external documentation" for more information about the usage of tag files.
 
-GENERATE_TAGFILE       = 
+GENERATE_TAGFILE       =
 
 # If the ALLEXTERNALS tag is set to YES, all external class will be listed in
 # the class index. If set to NO, only the inherited external classes will be
@@ -2192,14 +2192,14 @@ CLASS_DIAGRAMS         = YES
 # the mscgen tool resides. If left empty the tool is assumed to be found in the
 # default search path.
 
-MSCGEN_PATH            = 
+MSCGEN_PATH            =
 
 # You can include diagrams made with dia in doxygen documentation. Doxygen will
 # then run dia to produce the diagram and insert it in the documentation. The
 # DIA_PATH tag allows you to specify the directory where the dia binary resides.
 # If left empty dia is assumed to be found in the default search path.
 
-DIA_PATH               = 
+DIA_PATH               =
 
 # If set to YES the inheritance and collaboration graphs will hide inheritance
 # and usage relations if the target is undocumented or is not a class.
@@ -2248,7 +2248,7 @@ DOT_FONTSIZE           = 10
 # the path where dot can find it using this tag.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_FONTPATH           = 
+DOT_FONTPATH           =
 
 # If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
 # each documented class showing the direct and indirect inheritance relations.
@@ -2394,26 +2394,26 @@ INTERACTIVE_SVG        = YES
 # found. If left blank, it is assumed the dot tool can be found in the path.
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_PATH               = 
+DOT_PATH               =
 
 # The DOTFILE_DIRS tag can be used to specify one or more directories that
 # contain dot files that are included in the documentation (see the \dotfile
 # command).
 # This tag requires that the tag HAVE_DOT is set to YES.
 
-DOTFILE_DIRS           = 
+DOTFILE_DIRS           =
 
 # The MSCFILE_DIRS tag can be used to specify one or more directories that
 # contain msc files that are included in the documentation (see the \mscfile
 # command).
 
-MSCFILE_DIRS           = 
+MSCFILE_DIRS           =
 
 # The DIAFILE_DIRS tag can be used to specify one or more directories that
 # contain dia files that are included in the documentation (see the \diafile
 # command).
 
-DIAFILE_DIRS           = 
+DIAFILE_DIRS           =
 
 # When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
 # path where java can find the plantuml.jar file. If left blank, it is assumed
@@ -2421,17 +2421,17 @@ DIAFILE_DIRS           =
 # generate a warning when it encounters a \startuml command in this case and
 # will not generate output for the diagram.
 
-PLANTUML_JAR_PATH      = 
+PLANTUML_JAR_PATH      =
 
 # When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
 # configuration file for plantuml.
 
-PLANTUML_CFG_FILE      = 
+PLANTUML_CFG_FILE      =
 
 # When using plantuml, the specified paths are searched for files specified by
 # the !include statement in a plantuml block.
 
-PLANTUML_INCLUDE_PATH  = 
+PLANTUML_INCLUDE_PATH  =
 
 # The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
 # that will be shown in the graph. If the number of nodes in a graph becomes
diff --git a/Makefile b/Makefile
index 3fc8148..c368d50 100644
--- a/Makefile
+++ b/Makefile
@@ -23,7 +23,7 @@ LDFLAGS := -lm
 $(TARGET): $(OBJS) Makefile
 	$(CC) $(LDFLAGS) $(OBJS) -DVERSION=$(VERSION) -o $@ $(LDFLAGS) $(LOADLIBES) $(LDLIBS)
 
-doc: $(SRCS) Makefile
+doc: $(SRCS) Makefile Doxyfile
 	doxygen
 
 format: $(SRCS) $(HDRS) Makefile
diff --git a/src/arith/integer.c b/src/arith/integer.c
index 60ce8c3..5239746 100644
--- a/src/arith/integer.c
+++ b/src/arith/integer.c
@@ -13,6 +13,7 @@
 
 #include "conspage.h"
 #include "consspaceobject.h"
+#include "debug.h"
 
 /**
  * return the numeric value of this cell, as a C primitive double, not
@@ -40,9 +41,7 @@ struct cons_pointer make_integer( int64_t value ) {
     struct cons_space_object *cell = &pointer2cell( result );
     cell->payload.integer.value = value;
 
-#ifdef DEBUG
-    dump_object( stderr, result );
-#endif
+    debug_dump_object( result, DEBUG_ARITH );
 
     return result;
 }
diff --git a/src/arith/peano.c b/src/arith/peano.c
index 763414e..4cb8abd 100644
--- a/src/arith/peano.c
+++ b/src/arith/peano.c
@@ -16,6 +16,7 @@
 
 #include "consspaceobject.h"
 #include "conspage.h"
+#include "debug.h"
 #include "equal.h"
 #include "integer.h"
 #include "intern.h"
@@ -86,8 +87,8 @@ long double to_long_double( struct cons_pointer arg ) {
             break;
     }
 
-    fputws( L"to_long_double( ", stderr );
-    print( stderr, arg );
+    debug_print( L"to_long_double( ", DEBUG_ARITH );
+    debug_print_object( arg, DEBUG_ARITH );
     fwprintf( stderr, L") => %lf\n", result );
 
     return result;
@@ -129,13 +130,11 @@ struct cons_pointer add_2( struct stack_frame *frame,
     struct cons_space_object cell1 = pointer2cell( arg1 );
     struct cons_space_object cell2 = pointer2cell( arg2 );
 
-#ifdef DEBUG
-    fputws( L"add_2( arg1 = ", stderr );
-    print( stderr, arg1 );
-    fputws( L"; arg2 = ", stderr );
-    print( stderr, arg2 );
-    fputws( L")\n", stderr );
-#endif
+    debug_print( L"add_2( arg1 = ", DEBUG_ARITH );
+    debug_print_object( arg1, DEBUG_ARITH );
+    debug_print( L"; arg2 = ", DEBUG_ARITH );
+    debug_print_object( arg2, DEBUG_ARITH );
+    debug_print( L"\n", DEBUG_ARITH );
 
     if ( zerop( arg1 ) ) {
         result = arg2;
@@ -209,11 +208,9 @@ struct cons_pointer add_2( struct stack_frame *frame,
         }
     }
 
-#ifdef DEBUG
-    fputws( L"}; => ", stderr );
-    print( stderr, arg2 );
-    fputws( L"\n", stderr );
-#endif
+    debug_print( L"}; => ", DEBUG_ARITH );
+    debug_print_object( arg2, DEBUG_ARITH );
+    debug_print( L"\n", DEBUG_ARITH );
 
     return result;
 }
@@ -267,13 +264,11 @@ struct cons_pointer multiply_2( struct stack_frame *frame,
     struct cons_space_object cell1 = pointer2cell( arg1 );
     struct cons_space_object cell2 = pointer2cell( arg2 );
 
-#ifdef DEBUG
-    fputws( L"multiply_2( arg1 = ", stderr );
-    print( stderr, arg1 );
-    fputws( L"; arg2 = ", stderr );
-    print( stderr, arg2 );
-    fputws( L")\n", stderr );
-#endif
+    debug_print( L"multiply_2( arg1 = ", DEBUG_ARITH );
+    debug_print_object( arg1, DEBUG_ARITH );
+    debug_print( L"; arg2 = ", DEBUG_ARITH );
+    debug_print_object( arg2, DEBUG_ARITH );
+    debug_print( L")", DEBUG_ARITH );
 
     if ( zerop( arg1 ) ) {
         result = arg2;
@@ -348,11 +343,9 @@ struct cons_pointer multiply_2( struct stack_frame *frame,
         }
     }
 
-#ifdef DEBUG
-    fputws( L" => ", stderr );
-    print( stderr, arg2 );
-    fputws( L"\n", stderr );
-#endif
+    debug_print( L" => ", DEBUG_ARITH );
+    debug_print_object( arg2, DEBUG_ARITH );
+    debug_print( L"\n", DEBUG_ARITH );
 
     return result;
 }
diff --git a/src/arith/ratio.c b/src/arith/ratio.c
index afea5b0..f12acbb 100644
--- a/src/arith/ratio.c
+++ b/src/arith/ratio.c
@@ -13,7 +13,7 @@
 
 #include "conspage.h"
 #include "consspaceobject.h"
-#include "dump.h"
+#include "debug.h"
 #include "equal.h"
 #include "integer.h"
 #include "lispops.h"
@@ -332,9 +332,8 @@ struct cons_pointer make_ratio( struct cons_pointer frame_pointer,
                              ( "Dividend and divisor of a ratio must be integers" ),
                              frame_pointer );
     }
-#ifdef DEBUG
-    dump_object( stderr, result );
-#endif
+    debug_dump_object( result, DEBUG_ARITH );
+
 
     return result;
 }
diff --git a/src/arith/real.c b/src/arith/real.c
index d3786dd..84ba899 100644
--- a/src/arith/real.c
+++ b/src/arith/real.c
@@ -9,7 +9,7 @@
 
 #include "conspage.h"
 #include "consspaceobject.h"
-#include "dump.h"
+#include "debug.h"
 #include "read.h"
 
 /**
@@ -23,9 +23,7 @@ struct cons_pointer make_real( long double value ) {
     struct cons_space_object *cell = &pointer2cell( result );
     cell->payload.real.value = value;
 
-#ifdef DEBUG
-    dump_object( stderr, result );
-#endif
+    debug_dump_object( result, DEBUG_ARITH );
 
     return result;
 }
diff --git a/src/debug.c b/src/debug.c
new file mode 100644
index 0000000..27f7634
--- /dev/null
+++ b/src/debug.c
@@ -0,0 +1,65 @@
+/**
+ * debug.c
+ *
+ * Better debug log messages.
+ *
+ * (c) 2017 Simon Brooke <simon@journeyman.cc>
+ * Licensed under GPL version 2.0, or, at your option, any later version.
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+/*
+ * wide characters
+ */
+#include <wchar.h>
+#include <wctype.h>
+
+#include "consspaceobject.h"
+#include "debug.h"
+#include "dump.h"
+#include "print.h"
+
+/**
+ * the controlling flags for `debug_print`; set in `init.c`, q.v.
+ */
+int verbosity = 0;
+
+/**
+ * print this debug `message` to stderr, if `verbosity` matches `level`.
+ * `verbosity is a set of flags, see debug_print.h; so you can
+ * turn debugging on for only one part of the system.
+ */
+void debug_print( wchar_t *message, int level ) {
+#ifdef DEBUG
+    if ( level & verbosity ) {
+        fputws( message, stderr );
+    }
+#endif
+}
+
+/**
+ * print the object indicated by this `pointer` to stderr, if `verbosity`
+ * matches `level`.`verbosity is a set of flags, see debug_print.h; so you can
+ * turn debugging on for only one part of the system.
+ */
+void debug_print_object( struct cons_pointer pointer, int level ) {
+#ifdef DEBUG
+    if ( level & verbosity ) {
+        print( stderr, pointer );
+    }
+#endif
+}
+
+/**
+ * Like `dump_object`, q.v., but protected by the verbosity mechanism.
+ */
+void debug_dump_object( struct cons_pointer pointer, int level ) {
+#ifdef DEBUG
+    if ( level & verbosity ) {
+        dump_object( stderr, pointer );
+    }
+#endif
+}
diff --git a/src/debug.h b/src/debug.h
new file mode 100644
index 0000000..9c0448b
--- /dev/null
+++ b/src/debug.h
@@ -0,0 +1,28 @@
+/**
+ * debug.h
+ *
+ * Better debug log messages.
+ *
+ * (c) 2017 Simon Brooke <simon@journeyman.cc>
+ * Licensed under GPL version 2.0, or, at your option, any later version.
+ */
+
+#include <ctype.h>
+#include <stdio.h>
+
+#ifndef __debug_print_h
+#define __debug_print_h
+
+#define DEBUG_ALLOC 1
+#define DEBUG_STACK 2
+#define DEBUG_ARITH 4
+#define DEBUG_EVAL 8
+#define DEBUG_LAMBDA 16
+#define DEBUG_BOOTSTRAP 32
+#define DEBUG_IO 64
+
+extern int verbosity;
+void debug_print( wchar_t *message, int level );
+void debug_print_object( struct cons_pointer pointer, int level );
+void debug_dump_object( struct cons_pointer pointer, int level );
+#endif
diff --git a/src/init.c b/src/init.c
index 48516f6..bb722ae 100644
--- a/src/init.c
+++ b/src/init.c
@@ -11,26 +11,32 @@
 
 #include <stdbool.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <unistd.h>
 #include <wchar.h>
 
 #include "version.h"
 #include "conspage.h"
 #include "consspaceobject.h"
+#include "debug.h"
 #include "intern.h"
 #include "lispops.h"
 #include "peano.h"
 #include "print.h"
 #include "repl.h"
 
+// extern char *optarg; /* defined in unistd.h */
+
 void bind_function( char *name, struct cons_pointer ( *executable )
-                     ( struct stack_frame *, struct cons_pointer ) ) {
+                     ( struct stack_frame *,
+                       struct cons_pointer, struct cons_pointer ) ) {
     deep_bind( c_string_to_lisp_symbol( name ),
                make_function( NIL, executable ) );
 }
 
 void bind_special( char *name, struct cons_pointer ( *executable )
-                    ( struct stack_frame * frame, struct cons_pointer env ) ) {
+                    ( struct stack_frame *,
+                      struct cons_pointer, struct cons_pointer ) ) {
     deep_bind( c_string_to_lisp_symbol( name ),
                make_special( NIL, executable ) );
 }
@@ -46,7 +52,7 @@ int main( int argc, char *argv[] ) {
     bool dump_at_end = false;
     bool show_prompt = false;
 
-    while ( ( option = getopt( argc, argv, "pdc" ) ) != -1 ) {
+    while ( ( option = getopt( argc, argv, "pdcv:" ) ) != -1 ) {
         switch ( option ) {
             case 'c':
                 print_use_colours = true;
@@ -57,6 +63,8 @@ int main( int argc, char *argv[] ) {
             case 'p':
                 show_prompt = true;
                 break;
+            case 'v':
+                verbosity = atoi( optarg );
             default:
                 fwprintf( stderr, L"Unexpected option %c\n", option );
                 break;
@@ -68,9 +76,15 @@ int main( int argc, char *argv[] ) {
                   L"Post scarcity software environment version %s\n\n",
                   VERSION );
     }
-
+#ifdef DEBUG
+    fputws( L"About to initialise cons pages\n", stderr );
+#endif
     initialise_cons_pages(  );
 
+#ifdef DEBUG
+    fputws( L"Initialised cons pages, about to bind\n", stderr );
+#endif
+
     /*
      * privileged variables (keywords)
      */
diff --git a/src/memory/conspage.c b/src/memory/conspage.c
index 13d8373..75bcdc8 100644
--- a/src/memory/conspage.c
+++ b/src/memory/conspage.c
@@ -18,6 +18,7 @@
 
 #include "consspaceobject.h"
 #include "conspage.h"
+#include "dump.h"
 
 /**
  * Flag indicating whether conspage initialisation has been done.
@@ -168,7 +169,7 @@ void free_cell( struct cons_pointer pointer ) {
             fwprintf( stderr, L"About to free vector-space object at %ld\n",
                       cell->payload.vectorp.address );
 #endif
-            free( ( void * ) cell->payload.vectorp.address );
+            //free( ( void * ) cell->payload.vectorp.address );
             break;
 
     }
diff --git a/src/memory/conspage.h b/src/memory/conspage.h
index 7b8b930..bc1361e 100644
--- a/src/memory/conspage.h
+++ b/src/memory/conspage.h
@@ -19,7 +19,7 @@
  * 4294967296.
  *
  * Note that this means the total number of addressable cons cells is
- * 1.8e19, each of 20 bytes; or 3e20 bytes in total; and there are 
+ * 1.8e19, each of 20 bytes; or 3e20 bytes in total; and there are
  * up to a maximum of 4e9 of heap space objects, each of potentially
  * 4e9 bytes. So we're talking about a potential total of 8e100 bytes
  * of addressable memory, which is only slightly more than the
@@ -38,7 +38,7 @@ struct cons_page {
 };
 
 /**
- * The (global) pointer to the (global) freelist. Not sure whether this ultimately 
+ * The (global) pointer to the (global) freelist. Not sure whether this ultimately
  * belongs in this file.
  */
 extern struct cons_pointer freelist;
diff --git a/src/memory/consspaceobject.h b/src/memory/consspaceobject.h
index 44b6a79..47bbed0 100644
--- a/src/memory/consspaceobject.h
+++ b/src/memory/consspaceobject.h
@@ -133,7 +133,7 @@
  * A pointer to an object in vector space.
  */
 #define VECTORPOINTTAG  "VECP"
-#define VECTORPOINTTV 0
+#define VECTORPOINTTV 1346585942
 /**
  * An open write stream.
  */
@@ -263,9 +263,10 @@
  * An indirect pointer to a cons cell
  */
 struct cons_pointer {
-    uint32_t page;              /* the index of the page on which this cell
-                                 * resides */
-    uint32_t offset;            /* the index of the cell within the page */
+   /** the index of the page on which this cell resides */
+    uint32_t page;
+    /** the index of the cell within the page */
+    uint32_t offset;
 };
 
 /*
@@ -421,7 +422,7 @@ struct vectorp_payload {
                                  * tag. */
         uint32_t value;         /* the tag considered as a number */
     } tag;
-    struct vector_space_object *address;
+    void *address;
     /* the address of the actual vector space
      * object (TODO: will change when I actually
      * implement vector space) */
diff --git a/src/memory/cursor.c b/src/memory/cursor.c
new file mode 100644
index 0000000..31a38b2
--- /dev/null
+++ b/src/memory/cursor.c
@@ -0,0 +1,9 @@
+/*
+ * a cursor is a cons-space object which holds:
+ * 1. a pointer to a vector (i.e. a vector-space object which holds an
+ *    array of `cons_pointer`);
+ * 2. an integer offset into that array.
+ *
+ * this provides a mechanism for iterating through vectors (actually, in
+ * either direction)
+ */
diff --git a/src/memory/cursor.h b/src/memory/cursor.h
new file mode 100644
index 0000000..a50aff6
Binary files /dev/null and b/src/memory/cursor.h differ
diff --git a/src/memory/dump.c b/src/memory/dump.c
index 5aaedfb..e0c2bbc 100644
--- a/src/memory/dump.c
+++ b/src/memory/dump.c
@@ -20,6 +20,7 @@
 
 #include "conspage.h"
 #include "consspaceobject.h"
+#include "debug.h"
 #include "print.h"
 #include "stack.h"
 #include "vectorspace.h"
@@ -111,11 +112,25 @@ void dump_object( FILE * output, struct cons_pointer pointer ) {
             dump_string_cell( output, L"Symbol", pointer );
             break;
         case VECTORPOINTTV:{
+                fwprintf( output,
+                          L"\t\tPointer to vector-space object at %p\n",
+                          cell.payload.vectorp.address );
                 struct vector_space_object *vso = cell.payload.vectorp.address;
                 fwprintf( output,
                           L"\t\tVector space object of type %4.4s, payload size %d bytes\n",
-                          vso->header.tag, vso->header.size );
+                          &vso->header.tag.bytes, vso->header.size );
+                switch ( vso->header.tag.value ) {
+                    case STACKFRAMETV:
+                        dump_frame( output, pointer );
+                        break;
+                    default:
+                        fputws( L"(Unknown vector type)\n", output );
+                        break;
+                }
             }
             break;
+        default:
+            fputws( L"(Unknown cons space type)\n", output );
+            break;
     }
 }
diff --git a/src/memory/stack.c b/src/memory/stack.c
index 9f0f6f8..069b1ed 100644
--- a/src/memory/stack.c
+++ b/src/memory/stack.c
@@ -19,6 +19,8 @@
 
 #include "consspaceobject.h"
 #include "conspage.h"
+#include "debug.h"
+#include "dump.h"
 #include "lispops.h"
 #include "print.h"
 #include "stack.h"
@@ -30,21 +32,24 @@
  */
 struct stack_frame *get_stack_frame( struct cons_pointer pointer ) {
     struct stack_frame *result = NULL;
-    fputws
+    debug_print
         ( L"get_stack_frame: about to get a pointer to the vector space object\n",
-          stderr );
+          DEBUG_ALLOC );
     struct vector_space_object *vso =
         pointer2cell( pointer ).payload.vectorp.address;
-    fputws( L"get_stack_frame: got a pointer, about to test it\n", stderr );
+    debug_print( L"get_stack_frame: got a pointer, about to test it\n",
+                 DEBUG_ALLOC );
 
-    if ( vectorpointp( pointer ) ) {  // && stackframep(vso)){
-        fputws( L"get_stack_frame: pointer is good, about to set the result\n",
-                stderr );
+    if ( vectorpointp( pointer ) && stackframep( vso ) ) {
+        debug_print
+            ( L"get_stack_frame: pointer is good, about to set the result\n",
+              DEBUG_ALLOC );
 
         result = ( struct stack_frame * ) &( vso->payload );
-        fputws( L"get_stack_frame: all good, returning\n", stderr );
+        fwprintf( stderr, L"get_stack_frame: all good, returning %p\n",
+                  result );
     } else {
-        fputws( L"get_stack_frame: fail, returning NULL\n", stderr );
+        debug_print( L"get_stack_frame: fail, returning NULL\n", DEBUG_ALLOC );
     }
 
     return result;
@@ -57,11 +62,20 @@ struct stack_frame *get_stack_frame( struct cons_pointer pointer ) {
  * @return the new frame, or NULL if memory is exhausted.
  */
 struct cons_pointer make_empty_frame( struct cons_pointer previous ) {
-    fputws( L"Entering make_empty_frame\n", stderr );
+    debug_print( L"Entering make_empty_frame\n", DEBUG_ALLOC );
     struct cons_pointer result =
         make_vso( STACKFRAMETAG, sizeof( struct stack_frame ) );
+
+    debug_dump_object( result, DEBUG_ALLOC );
+
+    fwprintf( stderr,
+              L"make_empty_frame: got vector_space_object with size %lu, tag %4.4s\n",
+              pointer_to_vso( result )->header.size,
+              &pointer_to_vso( result )->header.tag.bytes );
+
     if ( !nilp( result ) ) {
-        fputws( L"make_empty_frame: about to call get_stack_frame\n", stderr );
+        debug_print( L"make_empty_frame: about to call get_stack_frame\n",
+                     DEBUG_ALLOC );
         struct stack_frame *frame = get_stack_frame( result );
         /*
          * TODO: later, pop a frame off a free-list of stack frames
@@ -69,9 +83,10 @@ struct cons_pointer make_empty_frame( struct cons_pointer previous ) {
 
         fwprintf( stderr,
                   L"make_empty_frame: about to set previous to %4.4s\n",
-                  pointer2cell( previous ).tag );
+                  &pointer2cell( previous ).tag.bytes );
         frame->previous = previous;
-        fputws( L"make_empty_frame: about to call inc_ref\n", stderr );
+        debug_print( L"make_empty_frame: about to call inc_ref\n",
+                     DEBUG_ALLOC );
         inc_ref( previous );
 
         /*
@@ -82,13 +97,13 @@ struct cons_pointer make_empty_frame( struct cons_pointer previous ) {
         frame->function = NIL;
         frame->args = 0;
 
-        fputws( L"make_empty_frame: about to initialise arg registers\n",
-                stderr );
+        debug_print( L"make_empty_frame: about to initialise arg registers\n",
+                     DEBUG_ALLOC );
         for ( int i = 0; i < args_in_frame; i++ ) {
             set_reg( frame, i, NIL );
         }
     }
-    fputws( L"Leaving make_empty_frame\n", stderr );
+    debug_print( L"Leaving make_empty_frame\n", DEBUG_ALLOC );
 
     return result;
 }
@@ -104,7 +119,7 @@ struct cons_pointer make_empty_frame( struct cons_pointer previous ) {
 struct cons_pointer make_stack_frame( struct cons_pointer previous,
                                       struct cons_pointer args,
                                       struct cons_pointer env ) {
-    fputws( L"Entering make_stack_frame\n", stderr );
+    debug_print( L"Entering make_stack_frame\n", DEBUG_ALLOC );
     struct cons_pointer result = make_empty_frame( previous );
 
     if ( nilp( result ) ) {
@@ -164,12 +179,11 @@ struct cons_pointer make_stack_frame( struct cons_pointer previous,
                 frame->more = more;
                 inc_ref( more );
             }
-#ifdef DEBUG
-            dump_frame( stderr, result );
-#endif
+
+            debug_dump_object( result, DEBUG_ALLOC );
         }
     }
-    fputws( L"Leaving make_stack_frame\n", stderr );
+    debug_print( L"Leaving make_stack_frame\n", DEBUG_ALLOC );
 
     return result;
 }
@@ -185,7 +199,7 @@ struct cons_pointer make_stack_frame( struct cons_pointer previous,
 struct cons_pointer make_special_frame( struct cons_pointer previous,
                                         struct cons_pointer args,
                                         struct cons_pointer env ) {
-    fputws( L"Entering make_special_frame\n", stderr );
+    debug_print( L"Entering make_special_frame\n", DEBUG_ALLOC );
 
     struct cons_pointer result = make_empty_frame( previous );
 
@@ -213,12 +227,11 @@ struct cons_pointer make_special_frame( struct cons_pointer previous,
                 frame->more = args;
                 inc_ref( args );
             }
-#ifdef DEBUG
-            dump_frame( stderr, result );
-#endif
+
+            debug_dump_object( result, DEBUG_ALLOC );
         }
     }
-    fputws( L"Leaving make_special_frame\n", stderr );
+    debug_print( L"Leaving make_special_frame\n", DEBUG_ALLOC );
 
     return result;
 }
diff --git a/src/memory/stack.h b/src/memory/stack.h
index 20acd73..b56f432 100644
--- a/src/memory/stack.h
+++ b/src/memory/stack.h
@@ -33,13 +33,13 @@
 /**
  * is this vector-space object a stack frame?
  */
-#define stackframep(vso)(vso->header.tag.value == STACKFRAMETV)
+#define stackframep(vso)(((struct vector_space_object *)vso)->header.tag.value == STACKFRAMETV)
 
 /**
  * set a register in a stack frame. Alwaye use this macro to do so,
  • because that way we can be sure the inc_ref happens!
  */
-#define set_reg(frame,register,value)frame->arg[register]=value; inc_ref(value)
+#define set_reg(frame,register,value){frame->arg[register]=value; inc_ref(value);}
 
 struct stack_frame *get_stack_frame( struct cons_pointer pointer );
 
diff --git a/src/memory/vectorspace.c b/src/memory/vectorspace.c
index db39b48..7dbe682 100644
--- a/src/memory/vectorspace.c
+++ b/src/memory/vectorspace.c
@@ -21,6 +21,7 @@
 
 #include "conspage.h"
 #include "consspaceobject.h"
+#include "dump.h"
 #include "vectorspace.h"
 
 
@@ -30,19 +31,18 @@
  * NOTE that `tag` should be the vector-space tag of the particular type of
  * vector-space object, NOT `VECTORPOINTTAG`.
  */
-struct cons_pointer make_vec_pointer( char *tag,
-                                      struct vector_space_object *address ) {
+struct cons_pointer make_vec_pointer( struct vector_space_object *address ) {
     fputws( L"Entered make_vec_pointer\n", stderr );
     struct cons_pointer pointer = allocate_cell( VECTORPOINTTAG );
-    struct cons_space_object cell = pointer2cell( pointer );
+    struct cons_space_object *cell = &pointer2cell( pointer );
     fwprintf( stderr,
-              L"make_vec_pointer: allocated cell, about to write tag '%s'\n",
-              tag );
-    strncpy( &cell.payload.vectorp.tag.bytes[0], tag, 4 );
-    fputws( L"make_vec_pointer: tag written, about to set pointer address\n",
-            stderr );
-    cell.payload.vectorp.address = address;
-    fputws( L"make_vec_pointer: all good, returning\n", stderr );
+              L"make_vec_pointer: tag written, about to set pointer address to %p\n",
+              address );
+    cell->payload.vectorp.address = address;
+    fwprintf( stderr, L"make_vec_pointer: all good, returning pointer to %p\n",
+              cell->payload.vectorp.address );
+
+    dump_object( stderr, pointer );
 
     return pointer;
 }
@@ -66,24 +66,32 @@ struct cons_pointer make_vso( char *tag, uint64_t payload_size ) {
     struct vector_space_object *vso = malloc( padded );
 
     if ( vso != NULL ) {
-        fwprintf( stderr, L"make_vso: about to write tag '%s'\n", tag );
+        fwprintf( stderr,
+                  L"make_vso: about to write tag '%s' into vso at %p\n", tag,
+                  vso );
         strncpy( &vso->header.tag.bytes[0], tag, TAGLENGTH );
-        vso->header.vecp = make_vec_pointer( tag, vso );
+        result = make_vec_pointer( vso );
+        dump_object( stderr, result );
+        vso->header.vecp = result;
+        // memcpy(vso->header.vecp, result, sizeof(struct cons_pointer));
+
         vso->header.size = payload_size;
 
 #ifdef DEBUG
         fwprintf( stderr,
-                  L"Allocated vector-space object of type %4.4s, total size %ld, payload size %ld\n",
-                  tag, total_size, payload_size );
+                  L"Allocated vector-space object of type %4.4s, total size %ld, payload size %ld, at address %p, payload address %p\n",
+                  &vso->header.tag.bytes, total_size, vso->header.size, vso,
+                  &vso->payload );
         if ( padded != total_size ) {
             fwprintf( stderr, L"\t\tPadded from %d to %d\n",
                       total_size, padded );
         }
 #endif
-
-        result = vso->header.vecp;
     }
-    fputws( L"make_vso: all good, returning\n", stderr );
+#ifdef DEBUG
+    fwprintf( stderr, L"make_vso: all good, returning pointer to %p\n",
+              pointer2cell( result ).payload.vectorp.address );
+#endif
 
     return result;
 }
diff --git a/src/memory/vectorspace.h b/src/memory/vectorspace.h
index caec968..1438d37 100644
--- a/src/memory/vectorspace.h
+++ b/src/memory/vectorspace.h
@@ -40,7 +40,7 @@
 #define VECTORTAG "VECT"
 #define VECTORTV 0
 
-#define pointer_to_vso(pointer)((vectorpointp(pointer)? pointer2cell(pointer).payload.vectorp.address : NULL))
+#define pointer_to_vso(pointer)((vectorpointp(pointer)? (struct vector_space_object *) pointer2cell(pointer).payload.vectorp.address : (struct vector_space_object *) NULL))
 #define vso_get_vecp(vso)((vso->header.vecp))
 
 struct cons_pointer make_vso( char *tag, uint64_t payload_size );
diff --git a/src/ops/intern.c b/src/ops/intern.c
index 100589a..8dea7c8 100644
--- a/src/ops/intern.c
+++ b/src/ops/intern.c
@@ -21,6 +21,7 @@
 
 #include "conspage.h"
 #include "consspaceobject.h"
+#include "debug.h"
 #include "equal.h"
 #include "lispops.h"
 #include "print.h"
@@ -56,22 +57,22 @@ internedp( struct cons_pointer key, struct cons_pointer store ) {
             struct cons_space_object entry =
                 pointer2cell( pointer2cell( next ).payload.cons.car );
 
-            fputws( L"Internedp: checking whether `", stderr );
-            print( stderr, key );
-            fputws( L"` equals `", stderr );
-            print( stderr, entry.payload.cons.car );
-            fputws( L"`\n", stderr );
+            debug_print( L"Internedp: checking whether `", DEBUG_ALLOC );
+            debug_print_object( key, DEBUG_ALLOC );
+            debug_print( L"` equals `", DEBUG_ALLOC );
+            debug_print_object( entry.payload.cons.car, DEBUG_ALLOC );
+            debug_print( L"`\n", DEBUG_ALLOC );
 
             if ( equal( key, entry.payload.cons.car ) ) {
                 result = entry.payload.cons.car;
             }
         }
     } else {
-        fputws( L"`", stderr );
-        print( stderr, key );
-        fputws( L"` is a ", stderr );
-        print( stderr, c_type( key ) );
-        fputws( L", not a SYMB", stderr );
+        debug_print( L"`", DEBUG_ALLOC );
+        debug_print_object( key, DEBUG_ALLOC );
+        debug_print( L"` is a ", DEBUG_ALLOC );
+        debug_print_object( c_type( key ), DEBUG_ALLOC );
+        debug_print( L", not a SYMB", DEBUG_ALLOC );
     }
 
     return result;
@@ -120,7 +121,17 @@ bind( struct cons_pointer key, struct cons_pointer value,
  */
 struct cons_pointer
 deep_bind( struct cons_pointer key, struct cons_pointer value ) {
+    debug_print( L"Entering deep_bind\n", DEBUG_ALLOC );
+    debug_print( L"\tSetting ", DEBUG_ALLOC );
+    debug_print_object( key, DEBUG_ALLOC );
+    debug_print( L" to ", DEBUG_ALLOC );
+    debug_print_object( value, DEBUG_ALLOC );
+    debug_print( L"\n", DEBUG_ALLOC );
+
     oblist = bind( key, value, oblist );
+
+    debug_print( L"Leaving deep_bind\n", DEBUG_ALLOC );
+
     return oblist;
 }
 
diff --git a/src/ops/lispops.c b/src/ops/lispops.c
index 1e6712d..da3bc82 100644
--- a/src/ops/lispops.c
+++ b/src/ops/lispops.c
@@ -26,6 +26,8 @@
 
 #include "consspaceobject.h"
 #include "conspage.h"
+#include "debug.h"
+#include "dump.h"
 #include "equal.h"
 #include "integer.h"
 #include "intern.h"
@@ -83,9 +85,8 @@ struct cons_pointer eval_form( struct stack_frame *parent,
                                struct cons_pointer parent_pointer,
                                struct cons_pointer form,
                                struct cons_pointer env ) {
-    fputws( L"eval_form: ", stderr );
-    print( stderr, form );
-    fputws( L"\n", stderr );
+    debug_print( L"eval_form: ", DEBUG_EVAL );
+    debug_dump_object( form, DEBUG_EVAL );
 
     struct cons_pointer result = NIL;
     struct cons_pointer next_pointer = make_empty_frame( parent_pointer );
@@ -148,9 +149,8 @@ struct cons_pointer compose_body( struct stack_frame *frame ) {
         }
     }
 
-    fputws( L"compose_body returning ", stderr );
-    print( stderr, body );
-    fputws( L"\n", stderr );
+    debug_print( L"compose_body returning ", DEBUG_LAMBDA );
+    debug_dump_object( body, DEBUG_LAMBDA );
 
     return body;
 }
@@ -180,13 +180,10 @@ lisp_nlambda( struct stack_frame *frame, struct cons_pointer frame_pointer,
 }
 
 void log_binding( struct cons_pointer name, struct cons_pointer val ) {
-#ifdef DEBUG
-    fputws( L"\n\tBinding ", stderr );
-    print( stderr, name );
-    fputws( L" to ", stderr );
-    print( stderr, val );
-    fputws( L"\"\n", stderr );
-#endif
+    debug_print( L"\n\tBinding ", DEBUG_ALLOC );
+    debug_dump_object( name, DEBUG_ALLOC );
+    debug_print( L" to ", DEBUG_ALLOC );
+    debug_dump_object( val, DEBUG_ALLOC );
 }
 
 /**
@@ -236,9 +233,9 @@ eval_lambda( struct cons_space_object cell, struct stack_frame *frame,
     while ( !nilp( body ) ) {
         struct cons_pointer sexpr = c_car( body );
         body = c_cdr( body );
-#ifdef DEBUG
-        fputws( L"In lambda: ", stderr );
-#endif
+
+        debug_print( L"In lambda: ", DEBUG_LAMBDA );
+
         result = eval_form( frame, frame_pointer, sexpr, new_env );
     }
 
@@ -414,8 +411,8 @@ lisp_eval( struct stack_frame *frame, struct cons_pointer frame_pointer,
     struct cons_pointer result = frame->arg[0];
     struct cons_space_object cell = pointer2cell( frame->arg[0] );
 
+    debug_print( L"Eval: ", DEBUG_EVAL );
 #ifdef DEBUG
-    fputws( L"Eval: ", stderr );
     dump_frame( stderr, frame_pointer );
 #endif
 
@@ -455,11 +452,8 @@ lisp_eval( struct stack_frame *frame, struct cons_pointer frame_pointer,
             break;
     }
 
-#ifdef DEBUG
-    fputws( L"Eval returning ", stderr );
-    print( stderr, result );
-    fputws( L"\n", stderr );
-#endif
+    debug_print( L"Eval returning ", DEBUG_EVAL );
+    debug_dump_object( result, DEBUG_EVAL );
 
     return result;
 }
@@ -476,7 +470,7 @@ struct cons_pointer
 lisp_apply( struct stack_frame *frame, struct cons_pointer frame_pointer,
             struct cons_pointer env ) {
 #ifdef DEBUG
-    fputws( L"Apply: ", stderr );
+    debug_print( L"Apply: ", DEBUG_EVAL );
     dump_frame( stderr, frame_pointer );
 #endif
     set_reg( frame, 0, make_cons( frame->arg[0], frame->arg[1] ) );
@@ -484,11 +478,8 @@ lisp_apply( struct stack_frame *frame, struct cons_pointer frame_pointer,
 
     struct cons_pointer result = c_apply( frame, frame_pointer, env );
 
-#ifdef DEBUG
-    fputws( L"Apply returning ", stderr );
-    print( stderr, result );
-    fputws( L"\n", stderr );
-#endif
+    debug_print( L"Apply returning ", DEBUG_EVAL );
+    debug_dump_object( result, DEBUG_EVAL );
 
     return result;
 }
@@ -690,13 +681,20 @@ lisp_equal( struct stack_frame *frame, struct cons_pointer frame_pointer,
 struct cons_pointer
 lisp_read( struct stack_frame *frame, struct cons_pointer frame_pointer,
            struct cons_pointer env ) {
+#ifdef DEBUG
+    debug_print( L"entering lisp_read\n", DEBUG_IO );
+#endif
     FILE *input = stdin;
 
     if ( readp( frame->arg[0] ) ) {
         input = pointer2cell( frame->arg[0] ).payload.stream.stream;
     }
 
-    return read( frame, frame_pointer, input );
+    struct cons_pointer result = read( frame, frame_pointer, input );
+    debug_print( L"lisp_read returning\n", DEBUG_IO );
+    debug_dump_object( result, DEBUG_IO );
+
+    return result;
 }
 
 
@@ -745,23 +743,22 @@ struct cons_pointer lisp_reverse( struct stack_frame *frame,
 struct cons_pointer
 lisp_print( struct stack_frame *frame, struct cons_pointer frame_pointer,
             struct cons_pointer env ) {
-#ifdef DEBUG
-    fputws( L"Entering print\n", stderr );
-#endif
+    debug_print( L"Entering print\n", DEBUG_IO );
     struct cons_pointer result = NIL;
     FILE *output = stdout;
 
     if ( writep( frame->arg[1] ) ) {
+        debug_print( L"lisp_print: setting output stream\n", DEBUG_IO );
+        debug_dump_object( frame->arg[1], DEBUG_IO );
         output = pointer2cell( frame->arg[1] ).payload.stream.stream;
     }
+    debug_print( L"lisp_print: about to print\n", DEBUG_IO );
+    debug_dump_object( frame->arg[0], DEBUG_IO );
 
     result = print( output, frame->arg[0] );
 
-#ifdef DEBUG
-    fputws( L"Print returning ", stderr );
-    // print( stderr, result );
-    fputws( L"\n", stderr );
-#endif
+    debug_print( L"lisp_print returning\n", DEBUG_IO );
+    debug_dump_object( result, DEBUG_IO );
 
     return result;
 }
@@ -828,8 +825,8 @@ lisp_cond( struct stack_frame *frame, struct cons_pointer frame_pointer,
 
     for ( int i = 0; i < args_in_frame && !done; i++ ) {
         struct cons_pointer clause_pointer = frame->arg[i];
-        fputws( L"Cond clause: ", stderr );
-        print( stderr, clause_pointer );
+        debug_print( L"Cond clause: ", DEBUG_EVAL );
+        debug_dump_object( clause_pointer, DEBUG_EVAL );
 
         if ( consp( clause_pointer ) ) {
             struct cons_space_object cell = pointer2cell( clause_pointer );
@@ -876,8 +873,8 @@ lisp_cond( struct stack_frame *frame, struct cons_pointer frame_pointer,
 struct cons_pointer
 throw_exception( struct cons_pointer message,
                  struct cons_pointer frame_pointer ) {
-    fwprintf( stderr, L"\nERROR: " );
-    print( stderr, message );
+    debug_print( L"\nERROR: ", DEBUG_EVAL );
+    debug_dump_object( message, DEBUG_EVAL );
     struct cons_pointer result = NIL;
 
     struct cons_space_object cell = pointer2cell( message );
diff --git a/src/ops/read.c b/src/ops/read.c
index 7d21dbe..e3cb480 100644
--- a/src/ops/read.c
+++ b/src/ops/read.c
@@ -18,6 +18,8 @@
 #include <wctype.h>
 
 #include "consspaceobject.h"
+#include "debug.h"
+#include "dump.h"
 #include "integer.h"
 #include "intern.h"
 #include "lispops.h"
@@ -59,6 +61,7 @@ struct cons_pointer c_quote( struct cons_pointer arg ) {
 struct cons_pointer read_continuation( struct stack_frame *frame,
                                        struct cons_pointer frame_pointer,
                                        FILE * input, wint_t initial ) {
+    debug_print( L"entering read_continuation\n", DEBUG_IO );
     struct cons_pointer result = NIL;
 
     wint_t c;
@@ -141,6 +144,8 @@ struct cons_pointer read_continuation( struct stack_frame *frame,
                 break;
         }
     }
+    debug_print( L"read_continuation returning\n", DEBUG_IO );
+    debug_dump_object( result, DEBUG_IO );
 
     return result;
 }
@@ -154,6 +159,7 @@ struct cons_pointer read_number( struct stack_frame *frame,
                                  struct cons_pointer frame_pointer,
                                  FILE * input,
                                  wint_t initial, bool seen_period ) {
+    debug_print( L"entering read_number\n", DEBUG_IO );
     struct cons_pointer result = NIL;
     int64_t accumulator = 0;
     int64_t dividend = 0;
@@ -210,9 +216,6 @@ struct cons_pointer read_number( struct stack_frame *frame,
         if ( negative ) {
             rv = 0 - rv;
         }
-#ifdef DEBUG
-        fwprintf( stderr, L"read_numer returning %Lf\n", rv );
-#endif
         result = make_real( rv );
     } else if ( dividend != 0 ) {
         result =
@@ -225,6 +228,9 @@ struct cons_pointer read_number( struct stack_frame *frame,
         result = make_integer( accumulator );
     }
 
+    debug_print( L"read_number returning\n", DEBUG_IO );
+    debug_dump_object( result, DEBUG_IO );
+
     return result;
 }
 
@@ -248,12 +254,9 @@ struct cons_pointer read_list( struct stack_frame *frame,
             make_cons( car,
                        read_list( frame, frame_pointer, input,
                                   fgetwc( input ) ) );
+    } else {
+        debug_print( L"End of list detected\n", DEBUG_IO );
     }
-#ifdef DEBUG
-    else {
-        fwprintf( stderr, L"End of list detected\n" );
-    }
-#endif
 
     return result;
 }
@@ -324,11 +327,8 @@ struct cons_pointer read_symbol( FILE * input, wint_t initial ) {
             break;
     }
 
-#ifdef DEBUG
-    fputws( L"Read symbol '", stderr );
-    print( stderr, result );
-    fputws( L"'\n", stderr );
-#endif
+    debug_print( L"read_symbol returning\n", DEBUG_IO );
+    debug_dump_object( result, DEBUG_IO );
 
     return result;
 }
diff --git a/src/repl.c b/src/repl.c
index d077ba8..f0dcbfa 100644
--- a/src/repl.c
+++ b/src/repl.c
@@ -13,6 +13,7 @@
 
 #include "conspage.h"
 #include "consspaceobject.h"
+#include "dump.h"
 #include "intern.h"
 #include "lispops.h"
 #include "read.h"
@@ -32,19 +33,25 @@
  */
 struct cons_pointer repl_read( struct cons_pointer stream_pointer ) {
     struct cons_pointer result = NIL;
+    fputws( L"Entered repl_read\n", stderr );
     struct cons_pointer frame_pointer = make_empty_frame( NIL );
+    fputws( L"repl_read: got stack_frame pointer\n", stderr );
+    dump_object( stderr, frame_pointer );
     if ( !nilp( frame_pointer ) ) {
         inc_ref( frame_pointer );
         struct stack_frame *frame = get_stack_frame( frame_pointer );
 
         if ( frame != NULL ) {
-
+            fputws( L"repl_read: about to set register\n", stderr );
             set_reg( frame, 0, stream_pointer );
+            fputws( L"repl_read: about to read\n", stderr );
             struct cons_pointer result =
                 lisp_read( frame, frame_pointer, oblist );
         }
         dec_ref( frame_pointer );
     }
+    fputws( L"repl_read: returning\n", stderr );
+    dump_object( stderr, result );
 
     return result;
 }
@@ -53,6 +60,7 @@ struct cons_pointer repl_read( struct cons_pointer stream_pointer ) {
  * Dummy up a Lisp eval call with its own stack frame.
  */
 struct cons_pointer repl_eval( struct cons_pointer input ) {
+    fputws( L"Entered repl_eval\n", stderr );
     struct cons_pointer result = NIL;
     struct cons_pointer frame_pointer = make_empty_frame( NIL );
     if ( !nilp( frame_pointer ) ) {
@@ -66,6 +74,8 @@ struct cons_pointer repl_eval( struct cons_pointer input ) {
 
         dec_ref( frame_pointer );
     }
+    fputws( L"repl_eval: returning\n", stderr );
+    dump_object( stderr, result );
 
     return result;
 }
@@ -75,6 +85,7 @@ struct cons_pointer repl_eval( struct cons_pointer input ) {
  */
 struct cons_pointer repl_print( struct cons_pointer stream_pointer,
                                 struct cons_pointer value ) {
+
     struct cons_pointer result = NIL;
     struct cons_pointer frame_pointer = make_empty_frame( NIL );
     if ( !nilp( frame_pointer ) ) {
@@ -102,12 +113,12 @@ struct cons_pointer repl_print( struct cons_pointer stream_pointer,
 void
 repl( FILE * in_stream, FILE * out_stream, FILE * error_stream,
       bool show_prompt ) {
+    fputws( L"Entered repl\n", stderr );
     struct cons_pointer input_stream = make_read_stream( in_stream );
-    pointer2cell( input_stream ).count = MAXREFERENCE;
+    inc_ref( input_stream );
 
     struct cons_pointer output_stream = make_write_stream( out_stream );
-    pointer2cell( output_stream ).count = MAXREFERENCE;
-
+    inc_ref( output_stream );
     while ( !feof( pointer2cell( input_stream ).payload.stream.stream ) ) {
         if ( show_prompt ) {
             fwprintf( out_stream, L"\n:: " );