Triskaidekalogophilia

Triskaidekalogophilia is an esolang with only 9 commands that only allow string manipulation. The commands can add, delete or change characters within a string. The name derives from the words describing the love of the number 13 and the love of words.

Syntax
Variable;Prompt Saves a user-inputted string in Variable with the prompt coming from the variable Prompt.

^Variable;Index Increases the ASCII value of the character at Index in Variable by 1. 127 becomes 0.

*Variable Removes the last character in Variable.

+Variable Adds a character with an ASCII value of 0 to the end of Variable.

?Variable;Index;Result Places the character in Variable at Index in Result.

=Variable1;Variable2 Executes the next command if the two variables are equal. If not, that line is skipped.

@LineNumber Goes to the specified line.

# Returns to the line after the last @ command. If there has already been a # command or no @ command the program returns to the beginning.

All numbers must be given in base-13 0-C, the case is irrelevant.

Cat program
+nil *nil >line;nil <line #

Interpreter
This is the code for the interpreter written in Python 3.3: import time Commands = {} Variables = {} def INPUT(String): String = String.split(';',1) if String[1] in Variables: Variables[String[0]] = input(Variables[String[1]]) def PRINT(String): if String in Variables: print(Variables[String]) def SHIFT(String): String = String.split(';',1) if String[0] in Variables: try: if not String[1] in Variables: Index = 0 else: Index = int(Variables[String[1]],13) Variables[String[0]] = list(Variables[String[0]]) Value = ord(Variables[String[0]][Index]) Value = (Value+1)%128 Variables[String[0]][Index] = chr(Value) Variables[String[0]] = ''.join(Variables[String[0]]) except ValueError: pass def DELCHAR(String): if not String in Variables: Variables[String] = '' Variables[String] = Variables[String][:-1] def ADDCHAR(String): if not String in Variables: Variables[String] = '' Variables[String] = list(Variables[String]) Variables[String].append(chr(0)) Variables[String] = ''.join(Variables[String]) def GETCHAR(String): String = String.split(';',2) if String[0] in Variables and String[1] in Variables: try: Index = int(Variables[String[1]],13) Variables[String[2]] = Variables[String[0]][Index] except ValueError: pass def EQUAL(String): global LineNumber String = String.split(';',1) if String[0] in Variables and String[1] in Variables: if Variables[String[0]] != Variables[String[1]]: LineNumber += 1 def GOTO(String): global LineNumber global LastJump LastJump = LineNumber LineNumber = int(Variables[String],13) def RETURN(String): global LineNumber global LastJump LineNumber = LastJump LastJump = 0 Commands[">"] = INPUT Commands["<"] = PRINT Commands["^"] = SHIFT Commands["*"] = DELCHAR Commands["+"] = ADDCHAR Commands["?"] = GETCHAR Commands["="] = EQUAL Commands["@"] = GOTO Commands["#"] = RETURN File = global LineNumber global LastJump LineNumber = 0 LastJump = 0 while LineNumber < len(File): Line = File[LineNumber] for Command in Commands: if Command == Line[0]: Function = Commands[Command] break else: Function = 'Comment' if Function != 'Comment': Function(Line[1:]) LineNumber += 1 print('\n=== END ===') time.sleep(5)