2012-03-05 15 views
2

私は現在、ゲーム内の古いスクリプト言語のインタプリタを実装している実験を行っています。それは第4言語に基づいていますので、指示(一度確認とsantized)を大きなリストに入れておくのはかなり簡単でしょう。リストエントリに基づいて関数を呼び出す方法は?

コードをリストに入れたら、プログラム全体を繰り返し実行して、forループで命令を1つずつ処理しています。文字列のような特定の項目は、現在のスタックを保持する変数に置くことができます。これは簡単です。しかし、私が立ち往生しているところでは、司令部が起こっている。

私は有効な関数の大きなリストを持っています。私はそれに一致する命令があれば、それが関連する関数を呼び出すところまで行きたいと思います。

私が持っていたのであれば、例えば、:

"Hello, world!" notify 

を...コードは、リスト内の通知をチェックして、通知機能を実行します。結論は次のとおりです。文字列を関数名に変換するにはどうすればよいですか?

+0

「Hello、world!」としたいですか? 'notify(" Hello、world! ")'のように動作するように 'notify'を実行しますか? –

+0

実際、通知を行うにはスタック変数を取り、必要な項目をポップするnotify関数を呼び出すことになります。 – Kelketek

+0

私はPythonでの正規表現の使い方に慣れていませんが、文字列を引用符で(すべて)一致させ、エスケープされた引用符を確認する必要があるようです。次に、キャプチャグループを使用して、呼び出す関数を決定します。構文解析は常に煩雑になる可能性があります。 –

答えて

4

あなたはコードを呼び出し、その後、あなたがする必要があるときにルックアップを行うことができます機能の辞書を保つことができる:

def notify(s): 
    print(s) 

d = {"notify": notify} 

d["notify"]("Hello, world!") 
+0

notify関数を呼び出してその結果をその辞書の値に入れるだけではどうですか? – Kelketek

+3

Pythonの関数はファーストクラスのオブジェクトで、 'notify'はその関数にバインドされた名前です(コードを試してみると、そのまま実行されます)。 – strcat

+0

チャームのように働いた!ありがとう! – Kelketek

0

あなたは番目の現在の現地での辞書です地元を通してそれを行うことができますシンボルテーブル:

locals()["notify"]() 

またはグローバルのシンボルテーブルと辞書を返しグローバルしかし:

globals()["notify"]() 

あなたは、引数にあまりに例えばを与えることができます。:

locals()["notify"]("Hello, world!") 

または

globals()["notify"]("Hello, world!") 
+0

独自のシンボルテーブルを作成できますか?私はユーザーがどんなコマンドを実行することもできないようにしたい。 – Kelketek

+1

'locals()'と 'globals()'は辞書を返しますので、代わりにあなた自身で作ることができます。 – strcat

+0

はい@strcatが正しいです。このインタフェースを使用して、http://docs.python.org/library/symtable.html#module-symtable を使ってこれらのシンボルテーブルを調べることができます。 –

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) 
0

あなたが関数に名前をマップcommandsと呼ばれるdictを持っている場合、あなたはこのようにそれを行うことができます。

def my_notify_function(): 
    print(stack.pop) 

commands = {'notify': my_notify_function, ...} 

for item in program: 
    if item in commands: 
     commands[item]() 
    else: 
     stack.push(item) 
0

は、関数名と、いくつかのタグの辞書を作成します。

私はこれを数回試してみましたが、これは本当にうまく動作します。

関連する問題