Решил разобраться в хитросплетениях современных (полу)функциональных языков
Начал с OCaml. Пробная программа - простейший интерпретатор арифметических выражений,
представленных в виде текстовых строк. Соответсвенно в такой программе необходима функция
лексического анализа вида
lexicalAnalys: string -> token list ,
где тип token имеет приблизительно следующий вид
type tokens = (* Типы лексем *)
TnInt of int | (* 12345 *)
TnPlus | (* + *)
TnMinus | (* - *)
TnMul | (* * *)
TnDiv | (* / *)
TnOpenP | (* ( *)
TnCloseP (* ) *)
;;
Вопрос:
Как правильно в функциональном стиле и без существенной потери производительности реализовать
функцию lexicalAnalys ? Все мои идеи своядтся к активному использованию циклов, переменных
состояния соответсвующего конечного автомата или к тормозному и некрасивому разрезанию
анализируемых строк на части. Циклы и переменные - злостная императивщина, разрезание строк -
зело ресурсоемкая операция. А как идеологически правильно ?
я не знаком с окамлом, но мне кажется, что все такие подобные задачи на ура решаются методом рекурсивного спуска. (если конечно грамматика его допускает)
Это понятно. Вопрос не в этом, вопрос в том, как правильно работать со
строками в OCaml-е не прибегая к имепративным "шутчкам" или к тупому
клонированию строк.
Вот, например, код на С выделющий во входной последовательности некое
число
char * inputStrBuf;
uint inputStrBufSize = strlen(inputStrBuf);
...
char intBuf [MAX_INT_LENGTH];
uint curBufIndex=0;
...
for (uint i=0; i<inputStrBufSize; i++)
{
...
if (isDigit(inputStrBuf[i]))
{
do {
intBuf[curBufIndex]=inputStrBuf[i];
} while (++curBufIndex,isDigit(inputStrBuff[++i]))
intBuf[curBufIndex]=0;
value = atoi(intBuf);
...
}
...
}
Впринице в меру изящно. Тоже самое или почти тоже самое можно написать
на OCaml-е, используя циклы и императивные переменные (счетчики
циклов) - будет выглядеть тоже довольно хорошо.
Идеологически правильное решение с использованием рекурсии видется мне
несколько кривым в данной ситуации, вынуждающим плодить сущности без
надобности. Хотелось бы чтобы кто-нибудь из гуру разубедил меня и
показал правильный чисто функциональный код аналогичный приведенному
выше на С.