2009-03-02 54 views
1

我有一個解析器,它實際上是一系列操作一系列詞法分析令牌的遞歸函數。什麼導致F#序列重新枚舉?

我遇到的問題是,序列似乎從遞歸函數調用開始重新啓動。鑑於以下骨架定義功能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結束位於序列的開始位置。

關於如何將序列定位在需要的位置的任何想法?

TIA

回答

2

我想你可能需要張貼稍大的片段,因爲我不太跟隨你。這就是說,一個序列(IEnumerable)就是這樣 - 一個序列,每次你爲(foreach)或者Seq。無論它在哪裏,它都會'重新'迭代序列。我不清楚你想做什麼,以及你期望發生什麼,但是對於一個解析來說,代表'標記'作爲一個序列可能是'錯誤的',因爲你通常將標記分成一個消費/提交區域和一個前瞻區域。

還要注意,你通常不希望'迭代序列'有副作用。

+0

你很正確。我意識到在我發佈這個問題之後,意識到問題所在。我試圖建立一個共享IEnumerator的等價物,這是錯誤的方法。我最終將它建立在名單上,傳遞了未消耗的剩餘。 – kolosy 2009-03-03 00:00:15