Mmmm()
Mmmm() is an esoteric "microlanguage" by SuperJedi224, inspired in part by Brainf***.
The only characters the interpreter actually pays any attention to are M
, m
, <
, >
, (
, )
, ,
, =
, [
, .
, and ]
.
Because all number literals are simply ignored, the most succinct known way to output the number 1
is mm=m[m.m()].m;m[mm(mm(mm(mm(mm(m.m())))))].m(mm(m.m()))
. (If number literals were not ignored, you could express this much more simply as m[5].m(1)
.)
An interpreter can be found here.
M denotes a variable declaration
<...>
denotes a loop while a value popped of the stack is neither 0
or null
m.m()
returns 0
m[0].m(y)
returns y+1
m[1].m()
initializes a counter (which is initially 0
)
m[2].m(y)
pushes y
to the stack
m[3].m()
pops a value from the stack and returns it; returns null
if the stack is already empty
m[4].m()
takes a number from the input stream and returns it
m[5].m(y)
appends y
to the output stream
m[6].m(y)
appends the character whose unicode id is y
to the output stream
m[7].m(a,f)
calls f
and returns its return value if a is neither 0
nor null
; otherwise returns 0
m[8].m(y)
returns y-1
if y>1
, or 0
otherwise
m[9].m()
returns a random number on [0,1).
Of course, because the language has no number literals, you have to construct these numbers
If mm
contains a number, mm.m()
returns mm%10
. If mm
contains a counter object, mm.m()
increments the counter and returns the new value.
Example Program
This program takes a number from input, and outputs the square (comments should be removed):
Mmmm=m[m[m.m()].m(m.m())].m(); //mmm = counter(0) Mmmmmmmmmm=m.m(); //mmmmmmmmm = 0 (the accumulator) mmm.m(); Mmm=mmm.m(); //mm = 2 mmm.m(); Mmmmm=m[mmm.m()].m(); //mmmm = input Mmmmmm= mmm.m();mmm.m();mmm.m(); //mmmmm = 5 Mmmmmmmmm=mmm.m(); //mmmmmmmm = 8 m[mm].m(mmmm); //push input to stack Mmmmmmm=m[mmmmmmmm].m(mmmm); //mmmmmmm = input - 1 Mmmmmmmm=mmmm; < //Begin loop m[mm].m(mmmmmm); //push input copy - 1 to stack mmmmmmm=mmmm; //mmmmmmm=input mmmmmm=m[mmmmmmmm].m(mmmmmm); //mmmmmm-=1 m[mm].m(mmmmmmm); //push mmmmmmm < mmmmmmmmm=m[m.m()].m(mmmmmmmmm);//increment accumulator mmmmmmm=m[mmmmmmmm].m(mmmmmmm); //decrement mmmmmmm m[mm].m(mmmmmmm); //push decremented value > > m[mmmmm].m(mmmmmmmmm); //output accumulator
Without comments, this becomes:
Mmmm=m[m[m.m()].m(m.m())].m();Mmmmmmmmmm=m.m();mmm.m();Mmm=mmm.m();mmm.m();Mmmmm=m[mmm.m()].m();Mmmmmm= mmm.m();mmm.m();mmm.m();Mmmmmmmmm=mmm.m();m[mm].m(mmmm);Mmmmmmm=m[mmmmmmmm].m(mmmm);Mmmmmmmm=mmmm;<m[mm].m(mmmmmm);mmmmmmm=mmmm;mmmmmm=m[mmmmmmmm].m(mmmmmm);m[mm].m(mmmmmmm);<mmmmmmmmm=m[m.m()].m(mmmmmmmmm);mmmmmmm=m[mmmmmmmm].m(mmmmmmm);m[mm].m(mmmmmmm);>>m[mmmmm].m(mmmmmmmmm);
This is the "Hello, World!" program:
Mmm=m[m.m()].m(m.m()); Mmmm=m[mm].m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();Mmmmm=mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();m[mmmm].m(mmm.m()); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();Mmmmmm=mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); Mmmmmmmmm=mmm.m(); m[mmmm].m(mmm.m()); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();Mmmmmmm=mmm.m(); m[mmmm].m(mmmmmm);m[mmmm].m(mmmmmm); mmm.m();mmm.m(); Mmmmmmmm=mmm.m(); m[mmmm].m(mmmmmmm); mmm.m();mmm.m(); Mmmmmmmmmm=mmm.m(); Mmmm=m[mm].m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m(); Mmmmmmmmmmm=mmm.m(); Mmmmmmmmmmmm=mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m();mmm.m();mmm.m(); mmm.m();mmm.m(); m[mmmm].m(mmm.m()); m[mmmm].m(mmmmmmmmmm); m[mmmm].m(mmmmm); m[mmmm].m(mmmmmmm); m[mmmm].m(mmmmmmmmm); m[mmmm].m(mmmmmm); m[mmmm].m(mmmmmmmm); m[mmmm].m(mmmmmmmmmmm);