質問
事実上、一連のレクサートークンを操作する一連の再帰関数であるパーサーがあります。
私が遭遇している問題は、再帰的な関数呼び出しでシーケンスが最初から再開されるように見えることです。次の関数のスケルトン定義があるとします。 Parse
let restricted = Seq.take_while token_search tokens
let compiled_nodes = Seq.fold (fun list (next: Lexer.Token) -> list @ parse_token this restricted next) [] restricted
関数 parse_token
に電話がかかる可能性があります Parse
.
ただし、その場合、パラメータは tokens
最終的にはシーケンスの先頭に配置されます。
シーケンスを必要な位置に配置し続ける方法について何かアイデアはありますか?
ティア
解決
私はあなたをあまりフォローしていないので、もう少し大きなスニペットを投稿する必要があるかもしれません。
とはいえ、シーケンス (IEnumerable) は単なるシーケンスであり、for (foreach) または Seq.Whatever を実行するたびに、シーケンスが「再反復」されます。あなたが何をしたいのか、何が起こると予想しているのかは不明ですが、通常、トークンを消費/コミットされた領域と先読み領域に分割するため、解析の場合、シーケンスとして「トークン」を表すことは「間違っている」可能性があります。
また、通常、「シーケンスの反復」に副作用が生じることは望ましくないことにも注意してください。
所属していません StackOverflow