mw-engine.core

Functions to transform a world and run rules.

Every rule is a function of two arguments, a cell and a world. If the rule fires, it returns a new cell, which should have the same values for :x and :y as the old cell. Anything else can be modified.

While any function of two arguments can be used as a rule, a special high level rule language is provided by the mw-parser package, which compiles rules expressed in a subset of English rules into suitable functions.

A cell is a map containing at least values for the keys :x, :y, and :state; a transformation should not alter the values of :x or :y, and should not return a cell without a keyword as the value of :state. Anything else is legal.

A world is a two dimensional matrix (sequence of sequences) of cells, such that every cell’s :x and :y properties reflect its place in the matrix. See world.clj.

Each time the world is transformed (see transform-world), for each cell, rules are applied in turn until one matches. Once one rule has matched no further rules can be applied to that cell.

apply-rule

(apply-rule world cell rule)(apply-rule world cell rule source)

Apply a single rule to a cell. What this is about is that I want to be able, for debugging purposes, to tag a cell with the rule text of the rule which fired (and especially so when an exception is thrown. So a rule may be either an ifn, or a list (ifn source-text). This function deals with despatching on those two possibilities. world is also passed in in order to be able to access neighbours.

run-world

(run-world world init-rules rules generations)

Run this world with these rules for this number of generations.

  • world a world as discussed above;
  • init-rules a sequence of rules as defined above, to be run once to initialise the world;
  • rules a sequence of rules as defined above, to be run iteratively for each generation;
  • generations an (integer) number of generations.

Return the final generation of the world.

transform-world

(transform-world world rules)

Return a world derived from this world by applying these rules to each cell.