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);