WARP

WARP is an object and stack based language, created by User:Aldous zodiac (talk) in May 2013. All numerics are signed, integral and expressed in hexatridecimal (base 36) notation, unless the radix system is changed within an executing program. WARP is a (weak) recursive acronym, WARP And Run Program - so called because it is expected that interpreters randomize 
the source program after each command is executed.
 
==Objects and expressions==
Basic pseudo grammatical terms:
* <object> ::= [a-z]{2}
* <sobject> ::= <object> | !
* <base-expr> ::= -{0,1}[0-9,A-Z]+ | <object> | "...." | ~ | `
* <expr> ::= <base-expr> | ! | _
* <label> ::= [a-z]+ | .
==Operators==
A few general purpose operators exist.
Command 	Description
=<object><expr> 	assign <expr> to <object>
><sobject><expr> 	increment <sobject> by <expr> and update <sobject>. If <expr> is non numeric, convert if possible, otherwise treat as 
0. If <sobject> is the pop command, use the stack as the source object and push the result onto the stack
<<sobject><expr> 	Decrement <sobject> by <expr> and update <sobject>. If <expr> is non numeric, convert if possible, otherwise treat as 
0
$<sobject><expr> 	Divide <sobject> by <expr> and update <sobject>. If <expr> is non numeric, convert if possible, or if 0, treat it as 
1
&<sobject><expr> 	Multiply <sobject> by <expr> and update <sobject>. If <expr> is non numeric, convert if possible, otherwise treat as 
1
# <sobject><expr> 	Calculate <sobject> mod <expr> and update <sobject>.
:<expr>:<expr> 	Compare the first <expr> with the second <expr>. Push the result of the comparison onto the stack. 
0 means equal, -1 is less than, 1 greater than
?<expr>?<command> 	Pop from the stack, and if that object equals <expr>, execute <command>.
Change the radix of numbers to <number> from now on	
==Stack manipulation==
There are several commands for stack manipulation.
Command 	Description
%<object> 	treat <object> as the stack; takes string of content and push each atomic object onto the stack - pushed so that repeated popping and 
sending to output is the same object as 'treated'
 	untreat the current stack
! 	pop
*<base-expr>	push <base-expr>
]<base-expr>	Pop and push <base-expr>
\ 	Turn off auto stacking mode
; 	Duplicate the top of stack
' 	Rotate the top two stacks in the stack of stacks
{<base-expr>	Retrieve the object at index <base-expr> from the random access stack and push onto the current stack
==Labels and movement==
WARP supports a simple label/jump set of commands.
Command 	Description
@<label> 	Declare a named label
^<expr><<label><	If <expr> == ., move to label unconditionally. If <expr> is zero or false, or represents an empty object, fall through
==Input and output==
WARP can interact with any existing input and output mechanisms.
Command 	Description
(<expr>	Output <expr> as a character
)<expr>	Output <expr> in its native form
,l 	Accept a line of user input and place onto the stack
,c 	Accept a character of user input and place onto the stack
_ 	a symbolic reference to the current stack
==Source access==
Access to the source is provided as well as the current traversal map.
Command	Description
~ 	The current randomized source
` 	The current traversal map of the randomized source
==Environment and execution==
First, the run time environment.
===Environment===
WARP has initially one, unbound or system, stack. Using the % operator, a bound object can usurp the unbound stack, until the | operator 
removes it. Think of it is as being similar to a stack of stacks. Issuing a | operator against the unbound stack will mean that the 
environment enters 'stackless' mode. All further stack based operations will not operate as expected, nor generate an error. There is no 
formal limit to the size and number of stacks and similarly in relation to source code.
In addition, the WARP environment has a single random access stack, manipulated with the { and } operators.
Note that all WARP objects are shared across the stack of stacks; if an assignment to an object xx occurs, and then a new stack 
is created, the value of xx will be available in the new stack context.
Compliant interpreters will auto create objects on demand, initialized to zero. 
===Execution===
Each source advance generates a random rewrite of the source, along with an attendant 'unscramble' map. Could be used for amusing output 
effects.
==Examples==
Hello World
 )"Hello World!"
Hello World #2
 =aa"Hello World!"%aa@x(!^_x| 
Quine
 )~
99 bottles of beer
 *"No more bottles of beer on the wall"+A=nb99@f=pl" ":nb:1?1?=pl"s" )nb)" bottle")pl)" of beer on the wall, ")nb)" bottle")pl
 )" of beer")", Take one down, and pass it around"(13(10<nb1^nbf)!
Fibonacci
 *1=na1=li1Z@z;)!)" ">!na;<!na=na!<li1^liz
Collatz conjecture #1 (objects)
 =se24E0)"Hailstone sequence for ")se@a)se=rese$re2=inre&in2:in:se?-1?^.o=sere^.r@o&se3>se1@r:se:1?1?^.a
Collatz conjecture #2 (stack and objects)
 =se24E0)"Hailstone sequence for ")se@a)se*se$!2;&!2:!:se?-1?^.o=se!^.r@o!&se3>se1@r:se:1?1?^.a
Primes less than some user entered value
 +A)"Enter start: ",l=cu!)"Primes <= ")cu)"\n":cu:2?-1?^.e@o*cu$!2=ca!@i*cu#!ca?0?^.n<ca1:ca:1?1?^.i)cu)" "@n<cu1*cu<!1^!o@e
Simple calculator (in decimal)
 +A)"WARP simple calculator: Enter q (as operator) to quit, c (as operator) to clear "(13(10
 =ac0@l)"Enter operator: ",l=op!:op:"q"?0?^.e:op:"c"?0?^.c
 )"Enter operand: ",l=nu!:op:"+"?0?>acnu:op:"-"?0?<acnu:op:"*"?0?&acnu:op:"/"?0?$acnu
 ^.p@c=ac0@p)ac(13(10^.l@e
Reverse a user entered string
 )"Enter a string to reverse: ",l=st!%st@r=ch!'*ch'^_r'@p)!^_p|
Brainfuck interpreter
 ,=bs!%bs=psN5D=pcps@m}pc>pc1^_m|=bf0=pcps@r{pc=cc!:"]":cc?0?^.l=ad0:"+":cc?0?=ad1:"-":cc?0?=ad-1:">":cc?0?>bf1
 :"<":cc?0?<bf1:".":cc?0?^.o:bf:0?-1?=bf0{bf>!ad}bf@n>pc1{pc:!:0?0?^.e^.r@o{bf(!^.n@l{bf:0:!?0?^.n=xx0@g<pc1{pc=cp!
 :cp:"]"?0?<xx1:cp:"["?0?>xx1:xx:1?0?^.n^.g@e
==External resources==
*An esoteric language toolkit with some standard interpreters, along with source code
Category:Languages
Category:Object-oriented paradigm
Category:2013
Category:Implemented