[Nemerle] Непонятки с variant-ами и match-ингом
От: Mckey Россия  
Дата: 16.01.07 09:45
Оценка:
Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2


#pragma indent
using System
using System.Console
using Token

public variant Token: IEquatable[Token]
  | Number{Num: double}
  | Method{Mthd: string}
  | Func{Fun: string}

  public override ToString(): string
    match(this)
      | Number(num) => "Num:"+num.ToString()
      | Method(str) => "Method:"+str
      | Func(str) => "Func:"+str

  public Equals(t: Token): bool
    match((this,t))
      | (Number(n1),Number(n2)) => n1 == n2    // Строка 1
      //| (Number(N1),Number(N2)) => N1 == N2  // Строка 2
      | (Method(mthd1),Method(mthd2)) => mthd1.Equals(mthd2)
      | (Func(fun1),Func(fun2)) => fun1.Equals(fun2)
      | _ => false

module Program
  static Main(): void
    def x = Method("Sum")
    def y = Method("Sum")
    def z = Number(5)
    WriteLine(x)
    WriteLine(y)
    WriteLine(z)
    WriteLine(x.Equals(y))
    WriteLine(y.Equals(z))



30.01.07 18:02: Перенесено модератором из 'Декларативное программирование' — IT
Делай добро и бросай его в воду...
Re: [Nemerle] Непонятки с variant-ами и match-ингом
От: Алексей П Россия  
Дата: 16.01.07 09:55
Оценка: +1
Здравствуйте, Mckey, Вы писали:

M>Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2



M>
M>      | (Number(n1),Number(n2)) => n1 == n2    // Строка 1
M>      //| (Number(N1),Number(N2)) => N1 == N2  // Строка 2
M>


Потому что связываемые значения должны начинаться с маленькой буквы. Ограничение, кажется, искусственное.
Re: [Nemerle] Непонятки с variant-ами и match-ингом
От: ie Россия http://ziez.blogspot.com/
Дата: 16.01.07 10:03
Оценка:
Здравствуйте, Mckey, Вы писали:

M>Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2


Это баг, запости в багтрэккер.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[2]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Mckey Россия  
Дата: 16.01.07 10:23
Оценка:
Здравствуйте, Алексей П, Вы писали:

АП>Здравствуйте, Mckey, Вы писали:


M>>Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2



M>>
M>>      | (Number(n1),Number(n2)) => n1 == n2    // Строка 1
M>>      //| (Number(N1),Number(N2)) => N1 == N2  // Строка 2
M>>


АП>Потому что связываемые значения должны начинаться с маленькой буквы. Ограничение, кажется, искусственное.

Это где-нить в документации описывается? Мне кажеться я не встречал такого...
Делай добро и бросай его в воду...
Re[2]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 16.01.07 10:43
Оценка:
ie,

M>>Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2


ie>Это баг, запости в багтрэккер.


В Немерле конструкторы алгебраических типов не различаются по первой заглавной букве?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: [Nemerle] Непонятки с variant-ами и match-ингом
От: ie Россия http://ziez.blogspot.com/
Дата: 16.01.07 11:36
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

M>>>Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2

ie>>Это баг, запости в багтрэккер.
LCR>В Немерле конструкторы алгебраических типов не различаются по первой заглавной букве?

Да, имена вариантов должны начинаться с заглавной, если ты об этом.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[3]: [Nemerle] Непонятки с variant-ами и match-ингом
От: ie Россия http://ziez.blogspot.com/
Дата: 16.01.07 11:39
Оценка:
Здравствуйте, Mckey, Вы писали:

АП>>Потому что связываемые значения должны начинаться с маленькой буквы. Ограничение, кажется, искусственное.

M>Это где-нить в документации описывается? Мне кажеться я не встречал такого...

Я не встречал даже документации
А если серьезно, то ИМХО не видно причин для такого ограничения.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[4]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Алексей П Россия  
Дата: 16.01.07 12:09
Оценка:
Здравствуйте, ie, Вы писали:

ie>Здравствуйте, Mckey, Вы писали:


АП>>>Потому что связываемые значения должны начинаться с маленькой буквы. Ограничение, кажется, искусственное.

M>>Это где-нить в документации описывается? Мне кажеться я не встречал такого...

ie>Я не встречал даже документации

ie>А если серьезно, то ИМХО не видно причин для такого ограничения.

http://nemerle.org/Grok_Variants_and_matching раздел Other patterns.
Re[4]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 16.01.07 12:19
Оценка: +1
ie,

ie>>>Это баг, запости в багтрэккер.

LCR>>В Немерле конструкторы алгебраических типов не различаются по первой заглавной букве?
ie>Да, имена вариантов должны начинаться с заглавной, если ты об этом.

Тогда почему это баг? N1 (или N2) в таком случае может трактоваться двояко — конструктор или переменная. Конструктор без параметров может быть?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Алексей П Россия  
Дата: 16.01.07 12:24
Оценка: +1
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>>>В Немерле конструкторы алгебраических типов не различаются по первой заглавной букве?

ie>>Да, имена вариантов должны начинаться с заглавной, если ты об этом.

LCR>Конструктор без параметров может быть?


Может, а паттерном может быть еще и конструктор, у которого вообще-то есть параметры, но они не указаны — просто проверка типа. И связывание параметров по именам тоже бывает.
Re[6]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 16.01.07 12:29
Оценка: +1
Алексей П,

LCR>>>>В Немерле конструкторы алгебраических типов не различаются по первой заглавной букве?

ie>>>Да, имена вариантов должны начинаться с заглавной, если ты об этом.
LCR>>Конструктор без параметров может быть?

АП>Может, а паттерном может быть еще и конструктор, у которого вообще-то есть параметры, но они не указаны — просто проверка типа. И связывание параметров по именам тоже бывает.


Ну вот, получается что это не баг, а фича...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[7]: [Nemerle] Непонятки с variant-ами и match-ингом
От: ie Россия http://ziez.blogspot.com/
Дата: 16.01.07 12:45
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

АП>>Может, а паттерном может быть еще и конструктор, у которого вообще-то есть параметры, но они не указаны — просто проверка типа. И связывание параметров по именам тоже бывает.

LCR>Ну вот, получается что это не баг, а фича...

Убедили Как-то не додумал с ходу до такой ситуации
... << RSDN@Home 1.2.0 alpha rev. 0>>
Превратим окружающую нас среду в воскресенье.
Re[2]: [Nemerle] Непонятки с variant-ами и match-ингом
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.01.07 17:25
Оценка:
Здравствуйте, ie, Вы писали:

M>>Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2


ie>Это баг, запости в багтрэккер.


Забавный такой баг. Компилятор явно знает о нем и выдает предупреждение, что мол так делать нельзя.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: [Nemerle] Непонятки с variant-ами и match-ингом
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.01.07 17:25
Оценка:
Здравствуйте, Lazy Cjow Rhrr, Вы писали:

LCR>Тогда почему это баг? N1 (или N2) в таком случае может трактоваться двояко — конструктор или переменная. Конструктор без параметров может быть?


С чего ж он будет двояко то трактоваться? Пересечение имен ведь нет. Ограничение, по-моему, надуманное. Ведь я без проблем могу создать класс имя кторого начинается с маленькой буквы и поля называть тоже по любому могу.

В общем, это они с других языков содрали, а зачем видимо не подумали.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Алексей П Россия  
Дата: 16.01.07 17:36
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>В общем, это они с других языков содрали, а зачем видимо не подумали.


Для порядку Называть классы с маленькой буквы весьма нехорошо. Еще мне нравится, что имена, начинающиеся с подчеркивания, имеют особый смысл — хаос со всякими __ в С++ довольно раздражает.
Re[7]: [Nemerle] Непонятки с variant-ами и match-ингом
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.01.07 19:41
Оценка: +1
Здравствуйте, Алексей П, Вы писали:

АП>Для порядку Называть классы с маленькой буквы весьма нехорошо. Еще мне нравится, что имена, начинающиеся с подчеркивания, имеют особый смысл — хаос со всякими __ в С++ довольно раздражает.


Термины "хорошо"/"не хорошо" ни к чему когда обсуждаются термины "можно"/"нельзя".
Иными словами препочтения и правила это одно. А возможности это другое.

Позволять называть классы и их поля как угодно, и при этом ограничивать именование вариантов — это непоследовательно и не размуно.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Андрей Хропов Россия  
Дата: 16.01.07 22:31
Оценка:
Здравствуйте, ie, Вы писали:

ie>Здравствуйте, Mckey, Вы писали:


M>>Почему в ниже приведенном коде компилятор ругается если заменить Строку 1 на закоментированную Строку 2


ie>Это баг, запости в багтрэккер.


здесь
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Аноним  
Дата: 17.01.07 00:13
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>С чего ж он будет двояко то трактоваться? Пересечение имен ведь нет. Ограничение, по-моему, надуманное. Ведь я без проблем могу создать класс имя кторого начинается с маленькой буквы и поля называть тоже по любому могу.


VD>В общем, это они с других языков содрали, а зачем видимо не подумали.


Как такое рулим?:


variant N
    | N1
    | N2


variant X
    | X1 { x:N }


match (x)
    | X1(N3) => "N3"
    | X1(N1) => "N1"
    | X1(n1) => "n1"
Re[7]: [Nemerle] Непонятки с variant-ами и match-ингом
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.01.07 00:45
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Как такое рулим?:


А>

А>variant N
А>    | N1
А>    | N2

А>variant X
А>    | X1 { x:N }

А>match (x)
А>    | X1(N3()) => "N3"
А>    | X1(N1()) => "N1"
А>    | X1(n1()) => "n1"
А>


Подойдет?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: [Nemerle] Непонятки с variant-ами и match-ингом
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 17.01.07 05:40
Оценка:
VladD2,

А>>

А>>match (x)
А>>    | X1(N3()) => "N3"
А>>    | X1(N1()) => "N1"
А>>    | X1(n1()) => "n1"
А>>


VD>Подойдет?


Как минимум некрасиво. Это то же самое, что требовать скобочки для любого энума или константы. Немного усложни пример, и ты сам потеряешься в скобках:
data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
data Month = Jan | Feb | Mar | Jun | Jul | Aug | Sep| Oct | Nov | Dec
data Season = Spring | Summer | Autumn | Winter

... и делаем деревце на основе этих типов.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.