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
Prints the value stored in Variable.
 >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.
==Examples==
===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 = [Foo.replace('\n',) for Foo in open(input("File: ")).readlines()]
 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)
Category:Languages
Category:String-rewriting paradigm
Category:2013
Category:Implemented