Rip — a stack-based rip language

All stack items are signed bigints.

  • 0-9: push value
  • P: pop
  • S: swap
  • D: duplicate
  • i: increment
  • d: decrement
  • r: pops the number of items to rotate anti-clockwise ("insert")
  • R: pops the number of items to rotate clockwise ("extract")
  • l: push length of stack (before this push)
  • a s m q M p: + - * / % ^ (add, subtract, multiply, quotient (integer), modulo, power)
  • G L E: greater, less, equal; booleans are 1 and 0, as you expect
  • n: not; equivalent to 0E
  • [ ... ]: syntactical; a codeblock
  • I: pops boolean, conditionally executing the codeblock that should follow the I, depending on the boolean (aka "if")
  • W: I, but then "while" instead of "if"
  • o: outputs the top value as an ascii char
  • O: outputs the top value as a number
  • g: gets a character and pushes the ascii value
  • C: open a socket connection to specified ip address, in 32- or 128-bit format for ipv4 or ipv6 resp., and port. Returns identifier
  • w: takes identifier and char; writes char to specified socket (leaves socket on stack)
  • t: takes identifier; takes char from specified socket and pushes it (leaves socket on stack)
  • c: takes identifier; closes that connection
  • F<bla>[code]: define a function named "bla" with the body "code"
  • <bla>: call the function named "bla"
  • $: outputs a stackdump
  • whitespace: nop
  • 'c: pushes the ascii value of c
  • "abcde": 'a'b'c'd'e
  • #<file.rip>: literally includes contents of 'file.rip' in-place

Any error causes the interpreter to exit, saying "rip".

Example code