Vague/AnimaLibera
Jump to navigation
Jump to search
An implementation of Vague by User:AnimaLibera. This may be considered a reference implementation because no other implementations are correct.
"""
The only standards-compliant implementation of Vague
Final version 1
"""
from sys import argv, exit
from random import randint
if len(argv) <= 1:
print("usage: python3 vague.py sourcefilename optionalbinarynumber")
exit(-8)
s = [] if len(argv) < 3 else [c == "1" for c in argv[2]]
c = open(argv[1]).read().replace("\t", " ").split("\n")
x, y = 0, 0
v = [1, 0]
d = 1 # number of D
p = 0 # number of (
while True:
try:
k = c[y][x]
except:
break
try:
if k.isspace():
pass
elif k == "+": # Add
s.append(bool(int(s.pop()) + int(s.pop())))
elif k == "-": # Decrement
if s[-1] == 0:
raise Exception("there are no numbers below 0")
s[-1] -= 1
elif k == "!": # Print
print(int(s[-1]))
elif k == ">": # Right
if d == 1 or (d == 2 and p > 0):
v[0] = 1
else:
v = [-v[1], +v[0]]
elif k == "<": # Left
if d == 1 or (d == 2 and p > 0):
v[0] = -1
else:
v = [+v[1], -v[0]]
elif k == "&": # NAND
s.append(not (s.pop() and s.pop()))
elif k == "=": # Push
if s:
s.append(s[-1])
elif k == "_": # Pop
s.pop()
elif k == ".": # End
break
elif k == "0": # Zero
s = list((False,))
elif k == "*": # Discouraged
if randint(0 + d + p + y, 8 + x + v[0]) == 0:
raise Exception("deliberate use of discouraged instruction")
else:
s.append(bool(int(s.pop()) * int(s.pop())))
elif k == "1": # 1D
d = 1
if v[0] == 0:
v = list((1, 0))
elif k == "2": # 2D
if p == 0:
d = 2
if abs(v[0]) + abs(v[1]) != 1:
v = list((1, 0))
elif k == "t": # True
s.append(True)
elif k == "f": # False
s.append(False)
elif k == "(": # Start
p += 1
elif k == ")": # End (
p -= 1
if p < 0:
raise Exception("no `(` to end when `)` used")
elif k == "u":
pass
else:
pass
except:
p -= 1
if p < 0:
raise Exception("no `(` to end when error")
if d == 1 or (d == 2 and p > 0):
x += v[0] if v[0] != 0 else 1
if x >= len(c[y]):
x, y = 0, y+1
elif x < 0:
y -= 1
x = len(c[y])-1
else:
x, y = x+v[0], y+v[1]
if s:
print("".join([str(int(v)) for v in s]))