Несогласованность в языке
От: calc.exe Россия  
Дата: 11.10.10 10:26
Оценка: 7 (3)
В статье Язык Nemerle Часть 3
Автор(ы): Чистяков Владислав Юрьевич
Дата: 25.07.2010
Неформальное введение в язык программирования Nemerle. В этой части, на базе примера «калькулятор», описываются типы данных variant и class.
читаем:

Обратите внимание на то, что в образце «переменная» может использоваться любое имя, начинающееся с маленькой буквы или подчеркивания (большую букву в образцах компилятор Nemerle рассматривает как имя типа).


Из этого следует, что Немерль имеет регистрозависимую семантику. Эта регистрозависимая семантика ложится на регистронезависимую семантику НЕТа. Естественно, эта несогласованность где-то должна вылезти.

Идентификатор с маленькой буквы в ПМ считается связанной переменной. Давайте сделаем вариант с маленькой буквы и попробуем его скормить ПМ.

  public variant V1
  {
    | field1
    | field2
  }

Опа! Немерль не пропускает и выдает нам ошибку:

variant options' names must start with capital letter


Интересно, эта фича известна в широких кругах немерлистов?

Итак, с вариантами фокус не прошел. А как с перичислениями? Заметьте, что вводить для перечислений внутренние правила Немерля бессмысленно, так как перечисление может быть импортировано. А там оно подчиняется правилам НЕТа, согласно которым исполнение программы не зависит от регистра букв идентификатора.

namespace Test1
{
  using MBox = System.Windows.Forms.MessageBox;

  public enum E1
  {
    | field1
    | field2
  }

  public module Lang
  {
    public Test(e: E1): string
    {
    | field1 => "field1"
    | field2 => "field2"
    }
    
    Main(): void
    {
      _ = MBox.Show(Test(E1.field1));
      _ = MBox.Show(Test(E1.field2));
    }
  }
}

Результатом исполнения программы будет вывод два раза "field1". Это говорит о том, что идентификатор field1 в ПМ понимается Немерлем как связанная переменная.

А теперь меняем буковку f на большую F:

namespace Test1
{
  using MBox = System.Windows.Forms.MessageBox;

  public enum E1
  {
    | Field1
    | Field2
  }

  public module Lang
  {
    public Test(e: E1): string
    {
    | Field1 => "Field1"
    | Field2 => "Field2"
    }
    
    Main(): void
    {
      _ = MBox.Show(Test(E1.Field1));
      _ = MBox.Show(Test(E1.Field2));
    }
  }
}

Получается вывод "Field1", "Field2". Теперь Немерль понимет Field1 как элемент перечисления.

Вот такие дела.
.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.