(请容忍我,我的代码太草率了,可能有点难以理解,主要是因为所有的变量,global
和if语句…)
我创建了一个解释性的、深奥的、基于磁带的编程语言,它是为代号为Tellurium(仅供参考)的高尔夫而设计的。到目前为止,除了条件语句外,它一直运行得很好。你知道吗
以下是条件语句的语法:
(integer[code]
下面是Python的等价物:
if tape[selectedCell] == integer:
code
所以,我的问题是,在一段代码中只能使用一次语句。多用一次就不行了。它甚至不会抛出错误。它什么也不做。你知道吗
下面是一些不起作用的命令示例,以及它们应该输出的内容。你知道吗
(0[^](1[^]+(1[^]
应该输出0后跟1。相反,只输出0。我认为这与first(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())
这不起作用,因为你使用的是globals。当您为第三个if语句点击
if tape[selectedCell] == int(''.join(num)):
时,nums
包含['1', '1']
,因为两个if语句都向num
添加了一个1,所以当您点击int(''.join(num))
时,最终得到的11
不等于1
。你知道吗您需要重构此代码以停止使用全局变量。有关如何不使用globals表示堆栈的工作示例,请查看esolang I wrote a couple months back。它没有我想要的那么完美,但是它有一个没有globals的工作堆栈。你知道吗
相关问题 更多 >
编程相关推荐