Что приводит к повторному перечислению последовательности F #? - PullRequest
1 голос
/ 03 марта 2009

У меня есть парсер, который фактически представляет собой набор рекурсивных функций, работающих на последовательности лексерных токенов.

Проблема, с которой я сталкиваюсь, заключается в том, что последовательность, кажется, перезапускается с самого начала при рекурсивных вызовах функций. Учитывая следующее определение скелета для функции 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 заканчивается позицией в начале последовательности.

Любые идеи о том, как сохранить последовательность, где она должна быть?

ТИА

1 Ответ

2 голосов
/ 03 марта 2009

Я думаю, что вам может понадобиться опубликовать немного больший фрагмент кода, так как я не совсем следую за вами.

Тем не менее, последовательность (IEnumerable) - это просто последовательность, и каждый раз, когда вы для (foreach) или Seq. Независимо от этого, она будет «повторять» последовательность. Мне неясно, что вы хотите сделать и что вы ожидаете, но для анализа представление «токенов» в виде последовательности может быть «неправильным», так как вы обычно делите токены на потребляемый / зафиксированный регион и область прогнозирования.

Обратите внимание, что обычно вы не хотите, чтобы «перебор последовательности» имел побочные эффекты.

...