gecho
The gecho programming language is often referred to without a capital 'g', and was created by Max Bernstein (User:Tekknolagi) in summer of 2011.
Inspiration
This language was inspired by Forth. It is stack-based.
Naming
This language was named after a typo by the author. He "meant to type 'echo' but wrote a 'g' in front by accident."
Commands
NOTE: gecho does not by default display the result of the operation! One must use `.`
- +
Pops two elements from the stack, adds them together, and pushes the result.
- ++
Pops all the elements from the stack and adds them together; pushes result.
- .
Prints the top element in the stack.
- *
Pops two elements from the stack, multiplies them, and pushes the result.
- dels
Pops all elements from the stack.
- show
Pretty prints the stack.
- dup
Pushes a copy of the top element of the stack.
- swap
Pops two elements from the stack, and pushes back in each other's places.
- -
Pops two elements from the stack, subtracts the upper from the lower, and pushes the result.
- jump
Pops an element from the stack (a) and prints stack[a]
- range
Pops two elements from the stack (a, b) and prints range(b, a); starts at b, increments by one until a, pushes the array onto the stack.
- [num]
Pushes `num` to the stack.
- **
Pops all the elements from the stack and multiplies them; pushes result.
- ![tapeindex]
Pop element from stack; set variables[tapeindex] to popped value.
- &[tapeindex]
Push variables[tapeindex] to the stack.
- wover
a = pop(); b = pop(); push(b); push(a); push(b); ( a1 a2 -- a1 a2 a1)
- drop
Pop top element from stack, show value.
- pop
see `drop`
- top
Push the index of the top of the stack to the stack.
- outascii
Pop top element of stack and print ASCII character that corresponds to decimal.
- print
Pop all elements of stack and prints ASCII characters that correspond to decimal.
- /
Pop top two elements from stack; divide lower element by upper element.
- @[mode]
Toggles mode specified.
- mode
Prints a list of all enabled modes.
- modes
Prints all modes, complete with 'enabled' flag.
- tot
For use with @tracker. Prints number of commands so far. Does not count as a command.
- reset
Resets the command count. For use with @tracker. Does not count as a command.
- tan
Pops one element from the stack (degrees!) computes tan(x)
- sin
Pops one element from the stack and computes sin(x)
- cos
Pops one element from the stack and computes cos(x)
- pow
a = pop(); b = pop(); push(b^a);
- mod
a = pop(); b = pop(); push(b%a);
- read
Reads user input. Only really useful with file reading/compiling. Pops one element from the stack and reads that number of numbers, and pushes them to the stack.
- <
b = pop(); a = pop(); push(a < b);
- >
a > b
- >=
a >= b
- <=
a <= b
- =
a == b
- '[word]
Push each character of <word> onto the stack.
- <>
Push ' ' to the stack.
- and
Push a && b to the stack.
- or
Push a || b to the stack.
- nil
Does absolutely nothing.
- next
Cycles through the stacks. If on stack 1, will move to stack 2.
- back
Does the opposite of `next`.
- mv
Moves the top element from the current stack to the next stack. To COPY, use `dup mv`.
Turing completeness
It is not yet Turing complete.
Examples
Hello World
'Hello, <> 'world! print
Limited Fibonacci
0 1 dup wover + dup wover + dup wover + dup wover +
Factorial
5 1 range **
Pushes the numbers 1 through 5 onto the stack, and then multiplies them all.
Multiple Stacks
1 2 + show next 3 4 + show
Computes 1+2, shows it, moves to the next stack, computes 3+4, and shows it.
See `mv` on how to exchange information between stacks.
Future Syntax
Loops
5 0 [ i ]
This pushes 5 and 0 to the stack, and then iterates from 0 to 5. `i` pushes the counter to the data stack each iteration. Fibonacci in a loop:
0 1 10 0 [ dup wover + ]
Iterates from 1 to ten, calculating 10 fibonacci numbers.
If Statements
if { 2 3 < ; 1 + ; 1 - }
If `2<3`, it adds one to the top of the stack. Otherwise, it subtracts one.
Function definitions
@sayhi { 'hello <> 'world print }
Stores the body into the function `sayhi` and whenever `*sayhi` is seen, it calls `sayhi`. Uses the stack for arguments.
@add { + }
Takes two arguments from the stack, adds them, and pushes the result.
Implementations
Downloadable
Its original implementation (and current implementation) can be found here.
Online Interpreter
One can experiment with gecho in an online interpreter here.