Re: Язык Nemerle.Часть 2
От: Real 3L0 Россия http://prikhodko.blogspot.com
Дата: 08.02.11 19:40
Оценка:
Здравствуйте, Владислав Чистяков(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 добавлялись в конец? Если это возможно. (Не обязательно дословно точно.)
Вселенная бесконечна как вширь, так и вглубь.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.