2011-09-08 3 views
4

私はnested function callsのうち特別なイテレータ(ビヘイビアツリー)を構築するPythonライブラリを持っています。 APIは(Pythonであるため)かなり良い軽量の構文を持っていますが、実際には宣言的なDSLを使用できます。宣言的なDSLをネストされた関数呼び出しに変換する

をDSL(YAMLを使用して)::ここで

は、私が想定してるもののラフスケッチです

tree: 
    - sequence: 
    - do_action1 
    - do_action2 
    - select: 
     - do_action3 
     - sequence: 
     - do_action4 
     - do_action5 
     - do_action6 

は、次のネストされた関数につながる呼び出します。

visit(
    sequence(
     do_action1(), 
     do_action2(), 
     select(
      do_action3(), 
      sequence(
       do_action4(), 
       do_action5(), 
       ), 
      do_action6(), 
      ) 
     ) 
    ) 

私はこれを行う方法を正確に視覚化するのに問題があります。 DSLはツリーを表現しなければならないので、単純な深さ優先のトラバースが適切と思われます。しかし、ネストされた関数呼び出しを構築するためには、何とかこの関数を呼び出す必要があります。おそらく仲介スタックや何らかの巧妙なものを含んでいるかもしれませんが、私はそれをかなり理解することはできません。この変換を実行する正しい方法は何ですか?

+0

"それは本当に、宣言DSLを使用することができますか"?本当に?あなたのPythonコードはあなたのDSLより*読みやすい*です。 DSLはどのように役立ちましたか? –

+0

この*非常に単純な例では、かっこは特にバグです。もっと複雑なツリーでは、特にキーワードargsが関与している場合、オプション( '* kwargs')の前に子(' * args')が来るように要求すると、読みやすさが著しく低下します。 [実例へのリンク](https://github.com/eykd/owyl/blob/master/examples/boids.py#L281)はこれを実証しています - 'parallel'ノードへの' policy'引数見逃しやすいです。 –

+1

「実際の生活の例」が実際に問題を示している場合、おそらくここにそのようなものを含めるべきです。 DSLは魅力的な迷惑です。私は1つのオファーに価値があるのを見ていない。例がある場合は、この質問を修正して、追加された複雑さの説得力のある理由を示してください。 –

答えて

3

私はあなたがスタックでそれを自分で行うのではなく、関数の呼び出しとパラメータを追跡することをPythonに任せることができると思います。

各ノードが関数呼び出しを表し、このノードの各子がパラメータ(関数呼び出しでもあるため、独自のパラメータを持つ可能性がある)であるYAML解析ツリーがあるとします。

(擬似コード)次のように続いて、このツリーのノードを評価する関数evaluateを定義します。最後に、パラメータとしてYAMLツリーのルートを渡すevaluateを呼び出して、あなたが取得する必要

def evaluate(node): 
    # evaluate parameters of the call 
    params = [] 
    for child in node: 
     params.append(evaluate(child)) 

    # now make the call to whatever function this node represents, 
    # passing the parameters 
    return node.function.call(*params) 

所望の挙動。


A若干異なるEVAL-適用構造

def evaluate(node): 
    # evaluate parameters of the call 
    params = [ evaluate(child) for child in node ] 

    # apply whatever function this node represents 
    return node.function.call(*params) 
+0

なぜそうだ、それはちょうどそれをするかもしれない。なぜこれが視覚化するのが難しいのか分かりません。 –

+1

"なぜこれは視覚化するのが難しいのですか"。DSLがあまり役に立たない理由のもう一つの例。 Pythonは容易に視覚化できました。簡単についてください。 –

+0

私はあなたがDSLの意見が低いと確信しています。本当にあなたが自分自身を決して見つけられないことを願っています。私の*自転車が青く塗られてほしいと言っても過言ではありません。そして今、私は塗料店に出ます。 –

関連する問題