(请耐心等待,我的代码真的很草率,可能有点难以理解,主要是因为所有的变量,global
s和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
。相反,它输出5n5
。
还有一个例子:(0[^](1[^](0[^]
。(1[^]
指令应该被解释器完全忽略,因为单元格的值不是1。还是零。因此,所需的输出应该是0n0
,因为有两个0[^]
命令。
CCD_ 15运行良好。它输出单元格的值,即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())
这不起作用,因为您使用的是全局变量。当您为第三个if语句点击if tape[selectedCell] == int(''.join(num)):
时,nums
包含['1', '1']
,因为两个if语句都向num
添加了1,所以当您点击int(''.join(num))
时,您最终得到的11
不等于1
。
您需要重构此代码以停止使用全局变量。关于如何不使用全局变量来表示堆栈的工作示例,请参阅我几个月前写的esolang。它并没有像我希望的那样完成,但它有一个没有全局变量的工作堆栈。