RETURN
RETURN is an esoteric programming language made by Ben Russell (the third one by this author so far), which incorporates a new theory, in which all commands are blank functions, that call other blank functions, and the commands are called by the number of functions passed through a function. It is called RETURN because commands are executed depending on the return codes, effectively.
Specification
The memory allocation is the same as in Brainfuck: 8-bits, planar.
The only symbols used are the two standard brackets ( and ). Everything else is a comment.
Commands are executed by the number of bracket groups in the current bracket group, e.g.
( (()()()) (()()()()()) (()()()) )
would do this:
-> subtract 1 move pointer right subtract 1 subtract 1
Commands
- 1. Add 1
- 3. Subtract 1
- 5. Move pointer right
- 7. Move pointer left
- 9. Put character (optional)
- 11. Put number
- 13. Get character (optional)
- 15. Get number
- 17. While nonzero repeat what's in the next group of brackets
- 19. If nonzero skip next group of brackets
- 21. While zero repeat what's in the next group of brackets
- 23. If zero skip next group of brackets
- 25. Exit with return code 0
- 27. Exit with return code defined at pointer
All other numbers do nothing.
Examples
Hello World
Hello World! By thematrixeatsyou. (())(())(())(())(())(())(())(()) (()()()()()()()()()()()()()()()()()) ( (()()()()()) ((())(())(())(())(())(())(())(())(())()) (()()()()()) ((())(())(())(())) (()()()()()) ( (())(())(())(())(()) (())(())(())(())(()) (())(())(())() ) ( (()()()()()()()) (()()()()()()()) (()()()()()()()) ) ) (()()()()()) (()()()()()()()()()) ((()()()()())(()()()()())()) ( (()()()) (()()()) ()()()()()()() ) (((((((()))))))) (()()()()()()()()()) (()()()()()()()()()) (((()))) (()()()()()()()()()) (()()()()()()()) (()()()()()()()()()) (()()()()()()()) (((((((((((((((()))))))))))))))) (()()()()()()()()()) ((()()()()())(()()()()())()()()()()()()) ((((())))()()()()()()()()) ( (()()()) (()()()) (()()()) )( (()()()) (()()()) ()()()()()()() ) (( (()()()) (()()()) (()()()) )( (()()()) (()()()) (()()()) )()()()()()()()) ((()()()()()()())(())()()()()()()()) (()()()()())(()()()()())((((((((((())))))))))) (()()()()()()()()()) ((((())))()()()()()()()()) Long enough for you?
This can also be expressed without whitespace; it looks damn awful when it's taken out.
Python Interpreter
This interpreter takes the input file, strips all non-bracket characters, puts an "A" after every opening bracket, puts an "A" at the start, puts ".run(Tape())" at the end, and then runs it. "A" is a special class to parse the RETURN stream.
NOTE: This is not the original interpreter; that's probably long gone. If anything fails, please prod me. I coded this thing in about an hour. --Ben Russell 19:51, 6 February 2010 (UTC)
# Scary RETURN interpreter
# By Ben "GreaseMonkey" Russell, 2010
# Public domain.
import sys
global GETCHBUF
GETCHBUF = ""
def getch():
while not GETCHBUF:
GETCHBUF = raw_input("")
c = GETCHBUF[0]
GETCHBUF = GETCHBUF[1:]
return c
def getint():
v = 0
while True:
c = ord(getch()) - '0'
if c >= 0 and c <= 9:
v *= 10
v += c
else:
break
return v
class Tape:
def __init__(self):
self.l = [0]
self.p = 0
def left(self):
self.p -= 1
if self.p < 0:
self.p = 0
def right(self):
self.p += 1
while self.p >= len(self.l):
self.l.append(0)
def get(self):
return self.l[self.p]
def put(self, v):
self.l[self.p] = int(v) & 0xFF
class A:
def __init__(self, inv):
self.cq = []
self.cv = 0
self.cp = None
self.__call__(inv)
def __call__(self, inv):
if inv == self.__class__:
self.cq.append(None)
else:
self.cq.append(inv)
inv.cp = self
self.cv += 1
return self
def run(self, tape, ci = 0, first = True):
i = 0
while i < len(self.cq):
o = self.cq[i]
if o:
i = o.run(tape, i, False)
i += 1
if not first:
i = ci
q = self.cv
if q == 1: # 1. Add 1
tape.put(tape.get()+1)
elif q == 3: # 3. Subtract 1
tape.put(tape.get()-1)
elif q == 5: # 5. Move pointer right
tape.right()
elif q == 7: # 7. Move pointer left
tape.left()
elif q == 9: # 9. Put character (optional)
sys.stdout.write(chr(tape.get()))
elif q == 11: # 11. Put number
sys.stdout.write(tape.get())
elif q == 13: # 13. Get character (optional)
tape.put(getch())
elif q == 15: # 15. Get number
tape.put(getint())
elif q == 17: # 17. While nonzero repeat what's in the next group of brackets
i += 1
o = self.cp.cq[i]
while tape.get():
if o:
o.run(tape, False)
elif q == 19: # 19. If nonzero skip next group of brackets
if not tape.get():
i += 1
elif q == 21: # 21. While zero repeat what's in the next group of brackets
i += 1
o = self.cp.cq[i]
while not tape.get():
if o:
o.run(tape, False)
elif q == 23: # 23. If zero skip next group of brackets
if tape.get():
i += 1
elif q == 25: # 25. Exit with return code 0
sys.exit(0)
elif q == 27: # 27. Exit with return code defined at pointer
sys.exit(tape.get())
return i
fp = open(sys.argv[1],"r")
fdata = ""
for c in fp.read():
if c == "(":
fdata += "(A"
elif c == ")":
fdata += ")"
fdata = "A" + fdata + ".run(Tape())"
exec fdata
External resources
RETURN interpreter(dead link) this link is dead, if you've got the interpreter, I suggest you mirror it, otherwise, please prod me if the Python interpreter is crap --Ben Russell 19:51, 6 February 2010 (UTC)- This has been PD'd. Disregard the license, and do whatever you want with it. --Ben Russell 05:37, 12 August 2008 (UTC)