私はおもちゃの動的言語 (javascript に悩まされている) を作成しています。私の実装は DLR の上にありますが、この問題の解決策はかなり言語/プラットフォームに依存しないと考えました。
再帰関数、または隣り合って存在する相互再帰関数をコンパイルすることに問題はありません。しかし、ネストされた相互再帰関数をコンパイルするのは非常に困難であることが判明しました。
テストに使用している関数の例は次のとおりです
void f(int x) {
void g(int y) {
if((x + y) < 100) {
f(x + y);
} else {
print(x + y);
}
}
g(x);
}
これを解決するための解決策はかなり一般的でなければならず (おそらく私が間違っているかもしれません)、DLR に固有のものではないと考えました。どうにかしてgの内部定義を取り除き、それをfの前に定義し、クロージャを維持する必要があると思います。環境。