ODDBALL

From Esolang
Jump to: navigation, search

ODDBALL, possibly an acronym for One Dimensional Deterministic Bully Automaton Layout Language, was created some time in the early 2000's by Tristan Parker for some reason or another. Its roots can be traced back to Lisp and ALPACA, though why anyone would do that is beyond me. In 2005, ODDBALL was released into the public domain, not through any sense of community enrichment, but out of sheer laziness.

Structure

Like Thue, ODDBALL is a matrioshka language; each program has an Imperative section and a Declarative section. The Imperative section contains commands in a FORTH like language defining states of a bully automaton, and the Declarative section contains one or more starting states and instructions on how to process them.

First glance

Imperative section
[
[[@/'x@/'o~]'o>]
[[@\'x@\'o~]'o>]
]
Declarative section
|"xxxxxxxxxxxxxoxxxxxxxxxxxx"|?|


The imperative section is surrounded by square brackets ([]) that can also be used to visually break up the program and offer scoping of local variables. The declarative section is surrounded by pipes (||) and also divided by them into blocks which give instructions on the creation of a one dimensional bully automaton.

Commands and structures

Imperative commands

Imperative commands are written using postscript notation (like Forth) and define the behaviour of bully cells.

@ A placeholder for "this cell", refers to the behavior of all cells.
' Indicates that the following character is the name of an object.
/ Indicates the cell to the immediate right of the cell in scope, bringing
  that cell into scope.
\ Indicates the cell to the immediate left of the cell in scope, bringing
  that cell into scope.
~ Sets the cell in scope to the object indicated.
> Stores the preceding function delineated by [] into the behavior of the
  object indicated.

Declarative structures

A list of automata are read left to right, but not evaluated unless other commands are encountered in the place of automata. In general, each automaton is treated as unbounded finite, unless indicated otherwise.

|x*o| Treat the following automaton as bounded on the left by 'x's and the
      right by 'o's.
|?| Evaluate the previous automaton iteratively, storing states in a buffer,
    and comparing each new state to all previous states until the new state is
    the same as a previous state, then stop and move to the next automaton.
|!| Evaluate the previous automaton a single generation.
|7!| Evaluate the previous automaton seven generations.
|"hello"!| Evaluate one generation of the previous automaton and append the
           string of objects "hello" to the left side of the automaton.
|s/a*a/ab1a/| Perform a regex substitution on the
              previous automaton (the code given replaces; for example, "aca"
              with "abca".
|"hello".| Create a new automaton that is tiled with the string "hello".

External resources