Conveyor
Conveyor is a concept language based on multiple workers each with two conveyor belts, two stacks, a collector, and a hand. There is a turn system in who gets turns in what order.
Example (3 thinkers):
- Initialization: Creates all the necessary objects and allocates required memory.
- Manager: Prepares the assembly line and starts it all up.
- Conveyor: Shifts the objects through the assembly line.
- Supervisor: Prepares for the next worker by clearing out the stacks, and dumping whatever is in the hand.
- Worker 1: Alters the objects currently stored on their section of the conveyor.
- Supervisor: Prepares for the next worker...
- Worker 2: Alters the objects currently stored...
- Supervisor...
- Worker 3...
- Jumper: If the halt command was not given, loops back to the conveyor.
- Manager: Finalizes the process.
- Manager: Prepares the assembly line and starts it all up.
- End: Frees the memory allocated and ends the program.
Commands
POPA - Picks an object off the top of stack A. POPB - Picks an object off the top of stack B. PSHA - Places an object on the top of stack A. PSHB - Places an object on the top of stack B. CLNA - Cleans out stack A. CLNB - Cleans out stack B. DUMP - Throws away whatever is held (places it into a void). DUPA - Duplicates the held item and places the copy on stack A. DUPB - Duplicates the held item and places the copy on stack B. PUTA - Places an object on conveyor A. PUTB - Places an object on conveyor B. GETA - Picks up an object from conveyor A. GETB - Picks up an object from conveyor B. ENDT - End turn. HALT - (Supervisor+) Signals the jumper not to jump. FAIL - (Manager+, Start only) Signals the program to exit without starting the assembly line. SWAP - Swaps stack A and B. SUBA - Pops from stack A, and subtracts the result from the hand. SUBB - Pops from stack B, and subtracts the result from the hand. MULA - Pops from stack A, and multiplies the result with the hand. MULB - Pops from stack B, and multiplies the result with the hand. DIVA - Pops from stack A, and divides (integer) the hand by the result. DIVB - Pops from stack B, and divides (integer) the hand by the result. MODA - Pops from stack A, and modulo's the hand by the result. MODB - Pops from stack B, and modulo's the hand by the result. SIFT - Pops from stack A, and searches for the result in stack B. If it is found, the value popped from stack A is added to the hand. QUIT - The worker quits its job and is replaced with a null worker. FIRE - (Supervisor+) The last turn's worker is replaced with a null worker. RAIS - (Supervisor+) The next QUIT called by the previous turn's worker is ignored. STME - Seeds the random number generator with the time. SEED - Pops stack A and seeds the random number generator with the result. RAND - Pops stack A and generates a random integer modulo the popped value and adds it to the hand. CERR - Pops stack A and sends the result modulo 256 as an unsigned char to std::cerr. INCR - Increment what I have in my hand. DECR - Decrement what I have in my hand. INC5 - Increment what I have in my hand by 5. DEC5 - Decrement what I have in my hand by 5.
IFEZ - If I am holding a zero or not holding any object... IFGT - Pops stacks A and B. If the result from A is greater than the result from B... ELSE - Should be self-explanatory. ENDF - End If.
Specifications
All commands end in a newline and have no arguments. Any characters after the 4-character command but before the newline are treated as comments. Putting something down (or picking something up) clears the source and adds to the destination. Or, in assembly:
ADD dest,src MOV src,0
Examples
Add the objects from conveyors A and B (a + b), and put the result on both A and B.
GETA GETB DUPA PUTA POPA PUTB ENDT - Oh yay our turn is finished.
Add and subtract the objects from conveyors A and B (a + b, a - b), and put the results in A and B respectively.
GETA DUPA PSHA GETB DUPB POPA PUTA POPA SUBB PUTB ENDT - We're done, right?
Copy the object from conveyor A and overwrite (not add) it onto conveyor B.
GETA DUPA PUTA GETB DUMP POPA PUTB ENDT - Your turn, now!
Apply the ROT13 transformation to each conveyor individually (not exactly rot13, I don't feel like writing a bunch of if's right now).
GETA INC5 INC5 INCR INCR INCR PUTA GETB INC5 INC5 INCR INCR INCR PUTB ENDT
Snippets
Ensure a job quit, regardless of a raise.
QUIT - You don't pay me enough! QUIT - My word is FINAL.