(请耐心等待,我的代码非常草率,可能有点难以理解,主要是因为所有变量,global
和if语句......)
我已经创建了一个解释性的,深奥的,基于磁带的编程语言,专为名为Tellurium的代码高尔夫设计(它是一个元素fyi)。到目前为止,除了条件语句之外,它的工作还不错。
这是条件语句的语法:
(integer[code]
这是Python的等价物:
if tape[selectedCell] == integer:
code
所以,我的问题是你只能在代码中使用一次语句。多次使用它,它不起作用。它甚至不会抛出错误。它什么都不做。
以下是一些不起作用的命令示例,以及它们应该输出的内容。
(0[^](1[^]+(1[^]
应该输出0后跟1.相反,输出仅 0.我认为它与第一个 (1[^]
有关,由于所选单元格的值不是1,所以应该由解释器跳过。
这是另一个例子:+++++(0[^](5[^]
。单元格的值增加到5.然后,(0[^]
检查单元格的值是否等于零。嗯,它不是,所以应该跳过它。接下来,(5[^]
检查单元格的值是否等于5。它是应该输出5
。相反,它输出5\n5
。
又一个例子:(0[^](1[^](0[^]
。解释器应该完全忽略(1[^]
指令,因为单元格的值不是1.它仍然为零。因此,所需的输出应为0\n0
,因为有两个0[^]
命令。
(0[^]
完美无缺。它输出单元格的值,即0。
我认为问题与应该跳过的语句有关,例如示例2中的(1[^]
。
我不知道为什么这不起作用,我已经尝试过了。我很感激一些帮助,我真的很想让这种语言重新开始!
所以,这里的解释器没有所有额外的命令。
tape = [0] * 25500
readingNum = False
readingIf = False
num = []
code = []
selectedCell = 0
def prompt():
userInput = input("> ")
return userInput
def read(cmd):
length = len(cmd)
commands = list(cmd)
for i in range(0, length):
parse(commands[i])
def parse(cmd):
global tape
global readingNum
global readingIf
global num
global code
global selectedCell
if readingNum == True:
if cmd == "[":
readingNum = False
readingIf = True
else:
num.append(cmd)
elif readingIf == True:
if cmd == "]":
readingIf = False
if tape[selectedCell] == int(''.join(num)):
read(code)
code = []
num = []
else:
return
else:
code.append(cmd)
elif cmd == "^":
print(tape[selectedCell])
elif cmd == "+":
tape[selectedCell] += 1
elif cmd == "(":
readingNum = True
else:
print("Error")
while 1:
read(prompt())
答案 0 :(得分:1)
这不起作用,因为你正在使用全局变量。当你点击if tape[selectedCell] == int(''.join(num)):
获取第三个if语句时,nums
包含['1', '1']
因为两个if语句都添加了1到num
,所以当你执行int(''.join(num))
时最终11
不等于1
。
您需要重构此代码以停止使用全局变量。有关如何不使用全局变量来表示堆栈的工作示例,请查看esolang I wrote a couple months back。它没有像我想的那样完成,但它有一个没有全局变量的工作堆栈。