我正在为一个游戏制作一个幻想的编程语言,所以我正在用python编写语言和解释器。该语言作为一个命令流工作,每一个命令在每一个“步骤”中都被解释。输入一个代码字符串,并将其转换为命令对象列表。解释器处理命令,但有些命令需要能够访问解释器的属性
例如,解释器跟踪活动命令(从第一个命令开始编号),因此goto命令需要更改活动命令。当前的方法是将数据传递到命令中,然后对其进行修改,解释器将其属性设置为等于
self.current = active.evaluate(self.current)
这将当前命令号设置为与输入的当前命令号计算的活动命令相同。整个街区都是这样的:
if active.complete(): # on command completion
type = active.return_type # get return type
# passes in requested data to modify
if type == "var": # changing var stream
self.var = active.evaluate(self.var)
elif type == "stream": # changing packet stream
self.stream = active.evaluate(self.stream)
elif type == "current": # changing current packet
self.current = active.evaluate(self.current)
elif type == "value": # returns argument for next command
self.holder = active.evaluate(self.var)
self.resolve = True
elif type == "none":
active.evaluate()
这似乎是一种不同的方法,有没有更好的方法从类内部修改类属性
我的简单答案是简单地传入解释器本身,并让对象更改解释器上的相关属性。如果您不想太多地打破现有的格式,可以给
evaluate()
函数两个参数:你会这样称呼它
然而,这似乎是一个实现多态性的好地方,它既可以解决您所问的问题,也可以消除对不断增长的
if
语句堆栈的需求首先,假设您有一个命令超类:
目前,您似乎正在使用命令的
return_type
来更改您对命令的操作。但是为什么不简单地检测将要运行的命令类型,并相应地实例化具有不同行为的不同子类呢之后,您可以在解释器中调用
active.evaluate(self)
,甚至不必关心它是哪种命令相关问题 更多 >
编程相关推荐