Re[15]: Что такого привлекательного в Nemerle?
От: Воронков Василий Россия  
Дата: 31.03.10 20:41
Оценка:
Здравствуйте, VladD2, Вы писали:

ВВ>>...По-моему не такие уж большие отличия по синтаксису.

VD>Дык ты в основном пользовался алгебраическими типами которые у обоих языков позаимствованы из ML-я. Если в Немерле еще указать "#pragma indent", то вообще очень похоже будет.

Вот тут есть интересный момент. Как только на Немерле начинаешь писать в функциональном стиле, то он плавным движением руки превращается в ML.
А вот у той же Скалы совсем другая философия — она вообще выглядит так, как будто в ней функциональные конструкции имитируются через ООП. Даже не знаю, как сказать точно. Может быть, некоторых пугает такая двойственность Немерле

ВВ>>Хотя вот почему-то он меня заставил аннотацию типа для функции написать

VD>Кто? F#?

Ну да.

ВВ>>А вот если писать на F# в стиле class based OOP это будет, конечно, кошмар

VD>Ага. С ФП у него намного лучше чес с ООП и МП. Это следствие того, что язык не проектировался с нуля, а является адаптацией OCaml-а. У создателей OCaml-а был свой, весьма своеобразный взгляд на ООП (функциональный).

Да вообще с их явным порядком файлов и плоской структурой проекта что-то большое на F# писать запаришься.

ЗЫ. Кстати, вот как выглядит вышепоказанный пример на моем интерпретаторе:

let (V, Q, K, T) = (13, 14, 15, 16);
type Card = Plain(v) | High(v);
    
let GetCardRank = c -> 
    match (c)
    | Plain(v) -> v
    | High(v) -> v;
        
type Comb =
    Single(c) | Pair(c) | TwoPair(p1, p2) | Three(c) | Street(c)
    | Flush(c) | Full(c) | Four(c) | StreetFlush(c);
    
let GetRank = cc ->
    match (cc)
    | Single(c) -> GetCardRank(c)
    | TwoPair(p1, p2) -> GetRank(p1) + GetRank(p2)
    | Pair(c) with r = 0x20 
    | Three(c) with r = 0x80
    | Street(c) with r = 0x100 
    | Flush(c) with r = 0x200
    | Full(c) with r = 0x300 
    | Four(c) with r = 0x400
    | StreetFlush(c) with r = 0x500 -> GetCardRank(c) + r;

let CalcRank = l -> match(l)
    | [] -> 0 | x::xs -> GetRank(x) + CalcRank(xs);
        
let cards = Comb.Pair(Card.High(V)) ::
    Comb.Single(Card.High(Q)) :: 
    Comb.Single(Card.Plain(6)) :: 
    Comb.Single(Card.High(T)) :: [];    

CalcRank(cards);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.