Stackstack

Stackstack is a stack-based programming language made in 2013 by User:T.J.S.1 at 15 years old. It can be described as a Forth-like language. The language began with one main interpreter written in Javascript, but more is being worked on.
== Description ==
Stackstack is a stack-based language (who would've guessed), but for convenience it supports variables too. The command reference can be found on the interpreter page.
It supports numerous instructions, called terms, which all operate on the stack, popping all used arguments. The terms can be separated by any amount of whitespace, giving one complete freedom in how to structure one's program indentation-wise. If a "#"-character is reached, the rest of the line is ignored, making it function as a comment character like in Bash or // in C(++).
An interesting feature of Stackstack over other stack-based languages is that it supports the well-known if statement and (a variation on) the while loop. The if statement can have an else in between the if and the endif, but it is not obligatory. The syntax is as follows:
 0
 if "yes" else "no" endif print
 32 char print
 1
 if "yes" endif print
The output of this program is "no yes".
 10 while
 dup tostring print
 32 char print
 1 - endwhile
The output of this program is "10 9 8 7 6 5 4 3 2 1 ".
== Examples == 
=== Hello, world! === 
"Hello, world!" in StackStack: 
 "Hello, world!" print 
Obvious as this may be, it shows the easy and wonderful use of StackStack. 
=== Quine === 
A quine in stackstack: 
 "34 char print dup print 34 char 10 char concat print print" 
 34 char print dup print 34 char 10 char concat print print 
So, this piece of code prints the code itself. A nice variation of quine is a narcissist. Narcissists are based on Greek mythology, where the boy Narcissus falls in love with his own mirror image. In this program, you have to enter the program's source code as input to get the response "1", (true). If you enter anything other than the sourcecode, the output will be "0" (false).
Narcissus code in Stackstack: 
 "34 char swap dup -3 roll concat
 34 char concat 10 char concat
 swap concat
 inputstr eq if 1 else 0 endif tostring print"
 34 char swap dup -3 roll concat
 34 char concat 10 char concat
 swap concat
 inputstr eq if 1 else 0 endif tostring print
=== Fibonacci ===
The stackstack version of Fibonacci:
 1 "a" store
 1 "b" store
 738 dup while
 	"a" retr
 	dup tostring print
 	10 char print
 	"b" retr
 	dup tostring print
 	10 char print
 	+ dup "a" store
 	"b" retr
 	+ "b" store
 1 - dup endwhile
A version without using variables, only the stack:
 0 1
 8 dup while -3 roll
 	swap dup 3 roll dup -3 roll
 	swap tostring print
 	10 char print
 	tostring print
 	10 char print
 	swap dup 3 roll dup -3 roll #o1,o2,o1,o2
 	+ #o1,o2,n1
 	3 roll #o2,n1,o1
 	pop #o2,n1
 	dup 3 roll #n1,n1,o2
 	+ #n1,n2
 3 roll 1 - dup endwhile
A recursively defined version which pops the top of the stack and returns the nth Fibonacci number:
 $fib dup 1 greater if dup 1 - @fib swap 2 - @fib + endif
 
 6 @fib
 9 @fib
 + # [42]
=== Guess the number ===
This is a simple guessing game with hints. There's probably a cleverer way to branch on [-1,0,+1].
 rand 100 *
 floor
 
 1 while
 dup inputnum -
 dup 0 less if "Lower!" alert endif
 dup 0 greater if "Higher!" alert endif
 endwhile
 
 "You win!" alert
=== 99 bottles ===
And finally, 99 bottles of beer:
 99 "bottles" store
 99 dup while
 	"bottles" retr tostring print
 	" bottle" "bottles" retr 1 eq not if "s" concat endif " of beer on the wall, " concat print
 	"bottles" retr tostring print
 	" bottle" "bottles" retr 1 eq not if "s" concat endif " of beer." concat print 
 	10 char print
 	"Take one down and pass it around, " print
 	"bottles" retr	1 - dup	 
 	"bottles" store
 	dup 0 eq if pop "no more" endif
 	tostring print 
 	" bottle" "bottles" retr 1 eq not if "s" concat endif " of beer on the wall." concat print
 	10 char dup print print
 1 - dup endwhile
 
 "No more bottles of beer on the wall, no more bottles of beer." 10 char concat
 "Go to the sore and buy some more, 99 bottles of beer on the wall." concat 10 char concat
 print
More examples can be found on the site of the interpreter.
== Interpreter ==
The main interpreter for StackStack can be used on .
User:Deciode has written another one and a C++ interpreter is work-in-progress.
Category:Languages
Category:Stack-based
Category:Turing complete
Category:Implemented