`make-instruction` will ignore any instructions that return `:ignore-instruction`. This allows instructions to be skipped without consuming their arguments.
There were two independent bugs in `vector/_subvec` that were turned up by our `test.check` testing.
The first was that the order of the arguments was wrong and `stop-raw` and `start-raw` were flipped.
The second was that `stop` wasn't max'ed with 0, which meant it could sometimes be negative, leading to an `IndexOutOfBoundsException`.
This is a start on using `test.check` to write tests for the vector instructions. We currently have tests for:
* `vector/_emptyvector`
* `vector/_indexof`
* `vector/_subvec`
There are _lots_ of other functions still to be tested.
This did reveal errors in `vector/_subvec`, which will be addressed in the next commit.
We used macros to make it easy to generate tests for each of the four vector types; this should be extensible to additional vector types in the future if needed.
This change uses the first command-line argument as the problem, which is assumed to be a namespace under `propeller.problems`. This will load the `instructions` and `error-function` from that namespace. If no problem is specified, then a (hopefully) helpful error is generated and the programs exits.
This allows us to call Propeller with calls such as:
```
lein run software.smallest
```
This creates a `push/utils/globals/cljc` similar to that created by @mcgirjau and moved the `max-stack-items` def to that namespace, updating `polymorphic` as necessary.
The `random-int` function in both `number-io` and `smallest` subtracted a floating point value (`100.0`), which means they were both _actually_ returning a float instead of an int.
This removes both of the ".0"s so that they return integers as advertised.
Both `_dup_times` and `_dup_items` are risky and can place very large numbers of items on a stack if the value on the `:integer` is large. This limits both `_dup_times` and `_dup_items` so they never make a stack have more than `max-stack-items` entries.
This change was motivated by `OutOfMemory` errors we were receiving when doing runs. This is somewhat modeled after similar limits in Clojush, but we chose to not introduce an `atom` and to instead just define a constant in this namespace. That may not be as flexible as people would like, and we can move to the `atom` solution if necessary.