私は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はツリーを表現しなければならないので、単純な深さ優先のトラバースが適切と思われます。しかし、ネストされた関数呼び出しを構築するためには、何とかこの関数を呼び出す必要があります。おそらく仲介スタックや何らかの巧妙なものを含んでいるかもしれませんが、私はそれをかなり理解することはできません。この変換を実行する正しい方法は何ですか?
"それは本当に、宣言DSLを使用することができますか"?本当に?あなたのPythonコードはあなたのDSLより*読みやすい*です。 DSLはどのように役立ちましたか? –
この*非常に単純な例では、かっこは特にバグです。もっと複雑なツリーでは、特にキーワードargsが関与している場合、オプション( '* kwargs')の前に子(' * args')が来るように要求すると、読みやすさが著しく低下します。 [実例へのリンク](https://github.com/eykd/owyl/blob/master/examples/boids.py#L281)はこれを実証しています - 'parallel'ノードへの' policy'引数見逃しやすいです。 –
「実際の生活の例」が実際に問題を示している場合、おそらくここにそのようなものを含めるべきです。 DSLは魅力的な迷惑です。私は1つのオファーに価値があるのを見ていない。例がある場合は、この質問を修正して、追加された複雑さの説得力のある理由を示してください。 –