Deadfish x

Deadfish x is a superset of Jonathan Todd Skinner's Deadfish. There are twice as many commands and uses the XKCD variant.
I (User:firefly431) will be writing a Python interpreter, but you guys can write whatever you want.
== Commands ==
x	Add 1 to x.
k	Output x to the console.
c	Square x.
d	Subtract 1 from x.
X	Start a function. The next character is the function name.
K	Output x as an ASCII character.
C	End the function or execute a function.
D	Set x to 0.
== Rules ==
X (the variable) can only go from 0 to 255. If it goes above or below, it will be set to 0.
You can type as many commands as you want on a line, but the prompt will only be shown when you push enter.
== Sample Programs ==
To run these, save them and run them, or just copy and paste.
<nowiki>
xxcxxxxcxxxxxxxxKDxxcxxxxxxcxKxxxxxxxKKxxxKDxxxxxxxcdddddKDxxxxxxcddddKDxxxcxxcddKddddddddKxxxKddddddKddddddddKDxxxxxxcdddK
</nowiki>
Prints out "Hello, world!"
<nowiki>
XUxKCxxcxxxxcCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCUCU
</nowiki>
Prints out the entire alphabet.
== Interpreter ==
=== Python ===
My interpreter. Put something here if you find a bug.
<nowiki>
# Deadfish x Programming Language
# By firefly431
# This is free and unencumbered software released into the public domain.
# Visit <http://unlicense.org/> for the full thing.
x = 0;
funcname = "";
curfunc = "";
lastc = ;
functions = {};
q_="i;iyratnrt gatmivpo";
_q=[0, 14, 17, 18, 4, 6, 10, 5, 7, 9, 2, 11, 8, 12, 16, 15, 13, 3, 1];
tar = [];
for i in _q: tar.append(q_[i]);
tar="".join(tar);
import webbrowser;
def openxkcd(num):
 webbrowser.open("http://xkcd.com/"+str(num)+"/");
def process(c): #Finite State Machine
 global x;
 global funcname;
 global curfunc;
 global lastc;
 global functions;
 if x<0 or x>255:
 x=0;
 if (lastc == 'X'): #we are starting a function
 funcname = c;
 print("Function start: "+c);
 lastc = ; #so if the name is C or X we don't process it
 return;
 if (lastc == 'C'): #we are executing a function
 print("Execute function: "+c);
 lastc = ; #same thing
 if (c in functions):
 for q in functions[c]: #c is taken
 process(q);
 else:
 print("Function '"+c+"' does not exist.");
 return;
 if funcname != "" and c != 'C': #We are in a function
 print("In function");
 curfunc += c;
 lastc = c;
 return;
 #check commands, function commands pass.
 if c == "x":
 x+=1;
 elif c == "k":
 print(str(x));
 elif c == "c":
 x*=x;
 elif c == "d":
 x-=1;
 elif c == "X":
 pass;
 elif c == "K":
 print(chr(x),end="");
 elif c == "C":
 if funcname != "":
 print("End Function");
 lastc = ; #so we don't execute a function
 functions[funcname] = curfunc;
 funcname = "";
 curfunc = "";
 return;
 elif c == "D":
 x=0;
 lastc = c;
def getInput(str = ""):
 global x;
 global tar;
 if str=="":
 inp = input(">> "); #change this to raw_input() if using python 2.x
 else:
 inp = str;
 if inp == tar:
 openxkcd(1061%354);
 for c in inp:
 process(c);
import sys;
fname = "";
lines = [];
if len(sys.argv)>1:
 fname = sys.argv[1];
if fname != "":
 try:
 fp = open(fname,"r");
 lines = fp.readlines();
 fp.close();
 except:
 print("Could not open file '"+fname+"'.");
if len(lines)>0:
 for line in lines:
 getInput(line);
else:
 try:
 while True:
 getInput();
 except KeyboardInterrupt:
 print("Bye!");
</nowiki>
=== Lua ===
<nowiki>
-- Deadfish x in pure Lua
-- By Atenfyr
local functions = {}
function deadfishx(str, tx)
	local ignore = {}
	local tx = tx or 0
	
	for i = 1, #str do
		if tx < 0 or tx > 255 then tx = 0 end
		if not ignore[i] then
			local instr = str:sub(i, i)
			if instr == "x" then
				tx = tx + 1
			elseif instr == "k" then
				io.write(tx)
			elseif instr == "c" then
				tx = tx ^ 2
			elseif instr == "d" then
				tx = tx - 1
			elseif instr == "X" then
				local _, nextC = str:sub(i+2):find("C")
				nextC = nextC+i+1
				for n = i+1, nextC do
					ignore[n] = true
				end
				functions[str:sub(i+1, i+1)] = str:sub(i+2, nextC)
			elseif instr == "K" then
				io.write(string.char(tx))
			elseif instr == "C" then
				ignore[i+1] = true
				tx = deadfishx(functions[str:sub(i+1, i+1)]:sub(1, -2), tx)
			elseif instr == "D" then
				tx = 0
			end
		end
	end
	
	return tx
end
-- If it's being loaded as a library (for some reason), then they now have the deadfishx function and the file can be closed
if pcall(debug.getlocal, 4, 1) then
	return
end
local q_ = "i;iyratnrt gatmivpo"
local _q = {1, 15, 18, 19, 5, 7, 11, 6, 8, 10, 3, 12, 9, 13, 17, 16, 14, 4, 2}
local tar = {}
for _, i in pairs(_q) do
	tar[#tar+1] = q_:sub(i, i)
end
tar = table.concat(tar, "")
local function openXKCD(n)
	if package.config:sub(1,1) == "\\" then
		os.execute('start "" "http:///xkcd.com/' .. n .. '/" >nul 2>&1')
	else
		-- I don't want to install Linux so if this breaks Linux users please let me know
		os.execute("xdg-open http://xkcd.com/" .. n .. "/ &> /dev/null")
	end
end
local x = 0
local tArgs = {...}
if tArgs[1] then
	local open = io.open(tArgs[1], "r")
	if not open then print("File does not exist!") os.exit() end
	local content = open:read("*a"):gsub("\r\n", ""):gsub("\n", "")
	open:close()
	deadfishx(content, x)
	os.exit()
end
while true do
	io.write(">> ")
	local cmd = io.read()
	
	if cmd == tar then
		openXKCD(1061%354)
	else
		x = deadfishx(cmd, x)
	end
	io.write("\n")
end
</nowiki>
Category:Joke languages
Category:Output only
Category:Implemented
Category:Languages