Здравствуйте, Владислав Чистяков(VladD2), Вы писали:
ВЧV>Статья:
ВЧV>Язык Nemerle.Часть 2Автор(ы): Чистяков Владислав Юрьевич
Дата: 30.06.2010
Неформальное введение в язык программирования Nemerle. В этой части, на базе примера «калькулятор», описываются типы данных variant и class.
В качестве одного из преимуществ языка приводится то, что его легче читать.
Где-то это явно видно, но где-то — мне ещё пока трудно перестроить мышление.
Например, в статье приводится код (основной пример):
def lexer(text : string) : list[Token]
{
mutable index = 0;
def peek() : char
{
if (index >= text.Length) '\0' else text[index]
}
def read() : char
{
def ch = peek();
when (index < text.Length)
index++;
ch
}
def isDigit(ch) { ch >= '0' && ch <= '9' }
def loop(resultTokens : list[Token]) : list[Token]
{
def number(ch : char, accumulator : int = 0) : int
{
def highOrderValue = accumulator * 10;
def currentOrderValue = ch - '0' : int;
def currentValue = highOrderValue + currentOrderValue;
if (isDigit(peek()))
number(read(), currentValue);
else
currentValue
}
def error()
{
WriteLine(string(' ', index - 1) + "^");
WriteLine("ожидается число или оператор");
(Token.Error() :: resultTokens).Reverse()
}
def ch = read();
match (ch)
{
| ' ' | '\t' => loop(resultTokens) // игнорируем пробелы
| '+' | '-' | '*' | '/' => loop(Token.Operator(ch.ToString()) :: resultTokens)
| '\0' => resultTokens.Reverse()
| _ when isDigit(ch) => loop(Token.Number(number(ch)) :: resultTokens)
| _ => error()
}
}
loop([])
}
1. Непревычно, что начало точки разбора функции, по сути, находится в самом конце. Ну, тут причина понятна, это я просто брюзжу.
2. Непревычно, что новые элементы в список resultTokens добавляются с начала, что приводит к необходимости переворачивать список. Я, конечно, понимаю, что пример специальный, но не мог бы кто-нибудь преобразовать функцию так, чтобы новые элементы в resultTokens добавлялись в конец? Если это возможно.
(Не обязательно дословно точно.)