2009-03-02 3 views
1

필자는 효과적으로 렉서 토큰 시퀀스에서 작동하는 재귀 함수 세트 인 파서를 보유하고 있습니다.F # 시퀀스가 ​​다시 열거되게하는 원인은 무엇입니까?

제가 직면 한 문제는 시퀀스가 ​​재귀 함수 호출에서 처음부터 다시 시작되는 것 같습니다. Parse으로 호출 될 수 있습니다 기능 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에 대해 다음과 골격 정의 감안할 때.

그러나 그런 경우 매개 변수 tokens이 시퀀스의 시작 부분에 위치하게됩니다.

순서를 유지하는 방법에 대한 아이디어는 어디에 있어야합니까?

TIA

답변

2

난 당신이 내가 당신을 아주 다음 있지 않다으로, 약간 더 큰 조각을 게시해야합니다 생각합니다.

즉, 시퀀스 (IEnumerable)는 바로 그 시퀀스입니다. 그리고 매번 (foreach) 또는 Seq.Whatever를 통해 시퀀스를 '반복'할 것입니다. 나는 당신이하고 싶은 것을 명확히하고 어떤 일이 일어날 지 예상하고 있지만, 토큰을 소비 된/커밋 된 영역과 미리보기 영역으로 나누기 때문에, '토큰'을 시퀀스로 나타내는 구문은 '잘못'일 수 있습니다.

일반적으로 '시퀀스 반복'에 부작용이 발생하지 않도록주의하십시오.

+0

당신은 확실히 옳았습니다. 나는 그 질문을 게시 한 후 그 사실을 깨달았습니다. 나는 잘못된 접근 방식 인 IEnumerator와 동일한 것을 만들려고했다. 나는 목록을 통해 건물을 짓고, 소비되지 않은 나머지를 지나쳤다. – kolosy