ClojureでDSLを作成していて、次のいずれかを選択できます。
a)後でASTに変換できるシンボリック形式でDSLを表す:
'(foo (bar (baz 1) (boo 3)))
b)DSLをASTノードを生成する純粋関数として表す:
(foo (bar (baz 1) (boo 3)))
=> [AST with foo at top level]
その後、ASTがコンパイルされます。
一方のアプローチをもう一方のアプローチよりも好む強い理由はありますか?
ClojureでDSLを作成していて、次のいずれかを選択できます。
a)後でASTに変換できるシンボリック形式でDSLを表す:
'(foo (bar (baz 1) (boo 3)))
b)DSLをASTノードを生成する純粋関数として表す:
(foo (bar (baz 1) (boo 3)))
=> [AST with foo at top level]
その後、ASTがコンパイルされます。
一方のアプローチをもう一方のアプローチよりも好む強い理由はありますか?
アプローチa)は、パーサーがS式を解析し、基本的に式ツリー内を前後に移動して、例に必要なコードを生成できるという意味で、より柔軟であるように見えます。fooの子を解析している間、パーサーはバックトラックできます。 b)のアプローチでは、DSLは通常の関数呼び出しであるため、boo呼び出しはその親などを認識しないため、その場合はバックトラッキングを適用できません。 。
複雑さの観点から-a)アプローチは柔軟ですが、バックトラッキングが実装されている場合は特に少し複雑になる可能性がありますが、アプローチb)は実装が簡単である必要があります。