We are currently working on new rules for what content should and shouldn't be allowed on this website, and are looking for feedback! See Esolang:2026 topicality proposal to view and give feedback on the current draft.

Huit interpreter

From Esolang
Jump to navigation Jump to search

The following Python script is an incomplete Huit interpreter.

prgm = input('>Huit ')
prgm += "\0" # NUL is the EOF
# Finds the location of all jump points
names = []
points = []
j = 0
k = 0
name = ""
for i in range(0, len(prgm)):
    if k == 1 and prgm[i] != ")":
        name += prgm[i]
    if prgm[i] == "\"":
        if prgm[i-1] == "\\": # To read " but ignore \" # Bug here
            pass
        else: j = (j + 1) % 2
    if j == 0:
        if prgm[i] == "(":
            k = 1
        elif prgm[i] == ")":
            k = 0
            names.append(name)
            points.append(i)
            name = ""
replace = ['\\n','\n','\\t','\t','\\\"','\"','\\\'','\'']
# Executes the program
floats = ['0','1','2','3','4','5','6','7','8','9','.','-']
input_string = ""
input_float = 0
char = 0
queue = []
inst = 0
def deq(repeat):
    for i in range(0, repeat):
        queue.pop(0)
def enq(a):
    queue.append(a)
while inst < len(prgm):
    if prgm[inst] == "+":
        enq(queue[0] + queue[1])
        deq(2)
    elif prgm[inst] == "-":
        enq(queue[0] - queue[1])
        deq(2)
    elif prgm[inst] == "*":
        enq(queue[0] * queue[1])
        deq(2)
    elif prgm[inst] == "/":
        enq(queue[0] / queue[1])
        deq(2)
    elif prgm[inst] == "%":
        queue.append(queue[0] % queue[1])
        deq(2)
    elif prgm[inst] == "&":
        read = ""
        if prgm[inst+1] == "\"":
            inst += 2
            while not (prgm[inst] == "\"" and prgm[inst-1] != "\\"): # Bug here
                read += prgm[inst]
                inst += 1
            for i in range(0, len(replace), 2): # Bug here
                read = read.replace(replace[i], replace[i+1])
            enq(read)
        else:
            inst += 1
            start = inst
            while prgm[inst] in floats:
                if prgm[inst] == '-' and inst != start:
                    break # To not read minus instructions.
                read += prgm[inst]
                inst += 1
            enq(float(read))
            inst -= 1
    elif prgm[inst] == ":":
        enq(queue[0])
    elif prgm[inst] == "?":
        if len(queue) > 0:
            deq(1)
    elif prgm[inst] == "(":
        while prgm[inst] != ")":
            inst += 1
    # [] is missing
    elif prgm[inst] == ">":
        if prgm[inst+1] == "\'":
            if type(queue[0]) == float:
                queue[0] = chr(int(queue[0]))
        print(queue[0])
        deq(1)
    elif prgm[inst] == "<":
        if prgm[inst+1] == "\'":
            input_float = input('> ')
            enq(input_float)
        else:
            if input_string == "":
                input_string = input('> ')
                char = 0
            enq(input_string[char])
            char += 1
    elif prgm[inst] == "#": # Debug character
        print("inst: %s, queue: %s" % (inst, queue))
        # Add strings to input format
    else:
        pass
    inst += 1