Extensible matching
От: Воронков Василий Россия  
Дата: 01.06.10 12:22
Оценка:
Нашел в архиве блогов вот такое:
http://web.archive.org/web/20080226221638/nemerle.org/Extensible_matching

Однако даже минимальный пример у меня не собирается:

variant Test {
  | Node { p :int; }
 
  public CustomPattern (p: int) : Test { 
    Node(p)
  }
 
  pattern CustomPattern (p : int) = CustomPattern (p);
}


Эту фишку открутили?
Re: Extensible matching
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.06.10 13:33
Оценка:
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Нашел в архиве блогов вот такое:

ВВ>http://web.archive.org/web/20080226221638/nemerle.org/Extensible_matching

ВВ>Эту фишку открутили?


А ее прикручивали? Ты дал ссылку на какой-то TODO-список.

Меж тем ПМ работает по классам, так что сам пример можно воспроизвести без указанных наворотов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Extensible matching
От: Воронков Василий Россия  
Дата: 01.06.10 15:44
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>Нашел в архиве блогов вот такое:

ВВ>>http://web.archive.org/web/20080226221638/nemerle.org/Extensible_matching
ВВ>>Эту фишку открутили?
VD>А ее прикручивали? Ты дал ссылку на какой-то TODO-список.

Не совсем. Мне тут товарищ серега дал ссылку на архив блогов:
http://web.archive.org/web/20080426004132/http://nemerle.org/blog/

Там есть запись "24 Jan 2006: Nemerle 0.9.2 in the wild", в которой данная фича указывается как реализованная:

This version brings a bunch of new features and of course several bugfixes. We now require mono 1.1.11+ or MS.NET 2.0. About 180 svn commits were done since the last release.

New language features:

Generators aka yield support
List comprehensions + ranges
Extensible pattern matching
'this' can be now used as the full type (including type parameters) of the current class.
Matching directly in function parameters, it is now possible to say
...


Вот это-то и вызвало удивление.
Re[3]: Extensible matching
От: Vermicious Knid  
Дата: 01.06.10 19:51
Оценка: 63 (2)
Здравствуйте, Воронков Василий, Вы писали:

ВВ>Не совсем. Мне тут товарищ серега дал ссылку на архив блогов:

ВВ>Extensible pattern matching
Это вот что такое:
#pragma indent
using Nemerle.Utility

[ExtensionPattern ( Node (t1, el, t2) = SNode (t1, el, t2, _) )] \
[ExtensionPattern ( t1 ::: t2 = SNode (t1, _, t2, _) )] \
public variant Tree
  | SNode 
      l : Tree
      e : int
      r : Tree
      size : int
  | Nil
 
  Size : int
    get
      match (this)
        | SNode (_,_,_,s) => s 
        | Nil => 0
 
  public Node (l : Tree, e : int, r : Tree) : Tree
    SNode (l, e, r, l.Size + r.Size + 1)  

  public Insert (e : int) : Tree
    match (this)
      | Node (l, e', r) =>
        if (e < e') l.Insert (e)
        else if (e > e') r.Insert (e)
        else this
      | Nil =>
        Node (Nil (), e, Nil ())
        

def t = Tree.Nil ().Insert (1).Insert (2).Insert (3)

match (t)
  | Node (_, e, _) =>
    System.Console.WriteLine (e)
  | Nil => assert (false)


match (t)
  | Tree.Node (el = e) =>
    System.Console.WriteLine (e)
  | Nil => assert (false)

match (t)
  | _ ::: _ => {}
  | Nil => {}

Это код теста из старой версии компилятора. В новом репозитории его видимо нет, но фича осталась. Фича довольно сомнительная в текущем виде, но она вшита в компилятор (следы есть в typing/Typer-PaternType.n и hierarchy/TypeInfo.n).

Код из wiki, который ты привел, это TODO к этой фиче.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.