Что приводит к повторному перечислению последовательности F #?
Вопрос
У меня есть синтаксический анализатор, который фактически представляет собой набор рекурсивных функций, работающих с последовательностью токенов lexer.
Проблема, с которой я сталкиваюсь, заключается в том, что последовательность, похоже, перезапускается с самого начала при вызовах рекурсивных функций.Дано следующее базовое определение функции 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.Независимо от того, что над ней, она будет "повторять итерацию" последовательности.Мне неясно, что вы хотите сделать и чего вы ожидаете, но для синтаксического анализа представление "токенов" в виде последовательности может быть "неправильным", поскольку вы обычно разделяете токены на потребляемую / зафиксированную область и область ожидания.
Обратите также внимание, что обычно вы не хотите, чтобы "повторение последовательности" приводило к побочным эффектам.