Tagged-code macros, bug-fixes for examples, and other minor Clojush updates
June 24, 2011by Lee Spector (lspector)
There have been a couple of Clojush updates since my last post here, with the most significant being tagged-code macros for facilitating the manipulation of code within the tag space (taking arguments from the tag space and then tagging results). Details are in the update comment below.
Available as usual from: https://github.com/lspector/Clojush
20110618: - Switched to Kyle Harrington's version of overlap; it's more clear,
possibly faster, and may fix a hard-to-trace bug that cropped up
in a long evolutionary run (?).
20110624: - Replaced lawnmower and dsoar examples with bugfixed versions
(thanks to Kyle Harrington).
- Added namespace and made miscellaneous other changes to
clojush-tests.clj.
- Added support for tagged-code macros. Tagged-code macro calls
have the effect of code instructions, but they take their
code arguments from the tag space and they tag their code return
values. They are implemented as macros to leverage the existing
code instruction set; note that this means that a single call
will contribute more than one iteration step toward the
evalpush-limit. Tagged-code macros appear in programs as hash maps
that map :tagged_code_macro to true, :instruction to a code
instruction, :argument_tags to a sequence of tags to be used
to acquire arguments, and :result_tags to a sequence of tags
to be used for tagging results. Execution of a macro expands
the needed code onto the exec stack to grab arguments from the tag
space and push them on the code stack, execute the code instruction,
and tag results. Note that results will also be left on the code
stack if global-pop-when-tagging is false. Conceptually, tag values
are "baked in" to these macros in much the same way that tag values
are "baked in" to the instruction names for stackless tag
instructions; we use hash maps simply because there is more
information to bake in and this prevents us from having to parse
the names (which would get messy and also waste time). Because
the maps make it difficult to read programs, however, a utility
function called abbreviate-tagged-code-macros is provided to
produce copies of programs with more human-readable (but not
currently executable) representations of tagged-macro calls.
A tagged-code-macro-erc is provided to generate random tagged-code
macros in pushgp runs. A new example, codesize20, provides
a simple demonstration of the use of tagged-code macros.

June 24th, 2011 at 12:46 pm
Note that a couple of tagged-code macros will behave a little oddly if required non-code arguments aren’t present. The tagged-code macro handler will noop if the tag space doesn’t contain the needed code, but not if other needed arguments aren’t present. That means that the retrievals and tagging will still be executed, even though the embedded call to the code instruction will noop. This will be oddest for code_insert and code_if, I think, and a bit odd also for code_extract, code_nth, and code_nthcdr. All of these will work fine when sufficient arguments are present, and they won’t cause errors or anything else really problematic in any event, but if a required argument isn’t present then some tag retrieval and tagging will still take place (in a repeatable way).