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)