a-gram

From Esolang
Jump to navigation Jump to search
This is still a work in progress. It may be changed in the future.

a-gram is an esoteric programming language that only accepts Unicode characters with "gram" in their name as valid characters.

Syntax

Basic commands

Command Description
(LESSER YIN) Grabs a single character from console and pushes its ASCII value onto the stack
(GREATER YANG) Outputs the value on the top of the stack as an ASCII character
(LESSER YANG) Outputs the value on the top of the stack as a number
(DECREASE) Decrements the value on the top of the stack
(INCREASE) Increments the value on the top of the stack
(HEAVEN) Pushes 1 onto the stack
(THE CREATIVE HEAVEN) Pushes 127 onto the stack
(THE WELL) Pushes a random number between 0 and 127 onto the stack
(ENTHUSIASM) Squares the value on the top of the stack
(ABUNDANCE) Duplicates the value on the top of the stack
(RETREAT) Takes the value from the bottom to the top of the stack

Note that if nothing is on the stack, using INCREASE and DECREASE will return with an error message.

Any other unrecognised character will be ignored by the compiler.

Flow control

a-gram allows you to loop based on certain conditions. You may start a loop by using the DURATION hexagram, . There are multiple conditions on which to loop based on. These are placed directly after the DURATION hexagram.

Condition Description
(INNER TRUTH) Loops while the current value on the stack is truthy (greater than 0)
(DISPERSION) Loops while the stack has values in it
(COMING TO MEET) Pops a value off the stack and then loops until the value currently on the stack is equal to the popped value
(SMALL PREPONDERANCE) Pops a value off the stack and then loops until the value currently on the stack is less than the popped value
(GREAT PREPONDERANCE) Pops a value off the stack and then loops until the value currently on the stack is greater than the popped value
(WAITING) Loops infinitely

The loop then must have a hexagram for BEFORE COMPLETION (䷿) to start the loop block, as well as a hexagram for AFTER COMPLETION () to end it.

For example, here is a simple yes-like program, along with an explanation of how it works.

⚍䷟䷄䷿䷶⚌䷾
⚍ Grab single character from STDIN
䷟ ䷄ Loop forever
䷿   {
  ䷶   Duplicate value on stack
  ⚌   Pop value off stack and print it
䷾   }

As well, there is one additional flow-control related command: RETURN (). This command jumps to the start of any loop it is in. If it is not in a loop, it will instead jump to the start of the file, making infinite loops that surround the entire program easier.

Example programs

Hello, world!

☰䷩䷩䷩䷩䷩䷩䷩䷏䷩䷩䷩䷩䷩䷩䷩䷩⚌
䷀䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷨䷶⚌
䷩䷩䷩䷩䷩䷩䷩䷶⚌ 
䷶⚌
䷩䷩䷩⚌
☰䷩䷩䷩䷩䷩䷩䷏䷨䷨䷨䷨䷨⚌
☰䷩䷩䷩䷩䷩䷏䷨䷨䷨䷨⚌
䷀䷨䷨䷨䷨䷨䷨䷨䷨䷶⚌
䷨䷨䷨䷨䷨䷨䷨䷨䷶⚌
䷩䷩䷩䷶⚌
䷨䷨䷨䷨䷨䷨䷶⚌
䷨䷨䷨䷨䷨䷨䷨䷨⚌
☰䷩䷩䷩䷩䷩䷏䷨䷨䷨⚌
☰䷩䷩䷩䷩䷩䷩䷩䷩䷩⚌

This outputs "Hello, world!" with a trailing newline.

Echo program

䷟䷄䷿⚏䷟䷺䷿䷠⚌䷾䷾

This fairly short program loops infinitely, echoing anything it receives from STDIN to STDOUT.

Implementations