我正在进行一项实验,我正在为旧的游戏内脚本语言实现解释器。它是一种基于第四语言的语言,所以我认为将指令(一旦经过验证和消化后)放入一个大清单就相当容易了。
一旦我在列表中得到代码,我就试图在for循环中迭代整个程序,一次处理一个指令。某些项目(如字符串)可以放在保存当前堆栈的变量上,这很容易。但是我被困在哪里就是让命令发生。
我有一大堆有效的函数列表,如果有任何指令匹配它们,我会喜欢它,它会调用相关的函数。
所以,例如,如果我有:
"Hello, world!" notify
...代码将检查列表中的notify,然后执行notify函数。底线是:如何将字符串转换为函数名称?
答案 0 :(得分:4)
您可以保留代码可以调用的函数字典,然后在需要时查找:
def notify(s):
print(s)
d = {"notify": notify}
d["notify"]("Hello, world!")
答案 1 :(得分:0)
您可以通过 locals 进行此操作,这是一个包含当前本地符号表的字典:
locals()["notify"]()
或者 globals ,它返回一个带有globals符号表的字典:
globals()["notify"]()
您也可以提供参数,例如:
locals()["notify"]("Hello, world!")
或
globals()["notify"]("Hello, world!")
答案 2 :(得分:0)
类似的东西:
import re
class LangLib(object):
pattern = re.compile(r'"(.*?)" (.*)')
def run_line(self, line):
arg, command = re.match(LangLib.pattern, line).groups()
return getattr(self, command)(arg)
def notify(self, arg):
print arg
然后你的引擎代码是:
parser = LangLib()
for line in program_lines:
parser.run_line(line)
答案 3 :(得分:0)
如果您有名为dict
的{{1}}将名称映射到函数,则可以这样执行:
commands
答案 4 :(得分:0)
创建函数名称和一些标签的字典。
之前我曾尝试过几次,效果非常好。