Избавляюсь от Nemerle.Imperative
От: MAMOHT  
Дата: 02.07.13 11:12
Оценка:
Добрый день.

Вот, пытаюсь переписать код из С#-style в правильный Nemerle.

В начале было так:

//найти в словаре значение и вернуть его ключ
mutable vv = -1;
foreach(k in Card.ValencyDict.Keys)
{
    when( Card.ValencyDict[k] == v )
    {
        vv = k;
        break;
    }


Мой пораженный императивщиной мозг выдал такой ужас:

def vv():int {
   -1;
   foreach(k when Card.ValencyDict[k] == v in Card.ValencyDict.Keys)
   {
      k;
   }
}
Valency = vv();


Но и тот на первой строке ругается: expected int, got void in assigned value: void is not a subtype of int

Какой код видят гуру-немерлисты?
Re: Избавляюсь от Nemerle.Imperative
От: hardcase Пират http://nemerle.org
Дата: 02.07.13 11:48
Оценка: 3 (1)
Здравствуйте, MAMOHT, Вы писали:

MAM>Добрый день.


MAM>Вот, пытаюсь переписать код из С#-style в правильный Nemerle.


MAM>В начале было так:


MAM>
MAM>//найти в словаре значение и вернуть его ключ
MAM>mutable vv = -1;
MAM>foreach(k in Card.ValencyDict.Keys)
MAM>{
MAM>    when( Card.ValencyDict[k] == v )
MAM>    {
MAM>        vv = k;
MAM>        break;
MAM>    }
MAM>


def vv = res: {
  foreach (k in Card.ValencyDict.Keys)
    when (Card.ValencyDict[k] == v)
      res(v);
  -1 // default value
};
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Избавляюсь от Nemerle.Imperative
От: STDray http://stdray.livejournal.com
Дата: 02.07.13 12:34
Оценка:
MAM>Вот, пытаюсь переписать код из С#-style в правильный Nemerle.

def vv =  Card.ValencyDict.Find(kv => kv.Value == v).WithDefault(-1);
Re[2]: Избавляюсь от Nemerle.Imperative
От: STDray http://stdray.livejournal.com
Дата: 02.07.13 12:38
Оценка:
STD>
STD>def vv =  Card.ValencyDict.Find(kv => kv.Value == v).WithDefault(-1);
STD>


Вру. Тут же словарик. Значит все несколько сложнее

def vv = if(Card.ValencyDict.Find(kv => kv.Value == v) is Some(kv)) kv.Value else -1;
Re[2]: Избавляюсь от Nemerle.Imperative
От: STDray http://stdray.livejournal.com
Дата: 02.07.13 12:40
Оценка:
Или еще вот так можно

def vv = Card.ValencyDict.Select(_.Value).Find(_ == v).WithDefault(-1);
Re[3]: Избавляюсь от Nemerle.Imperative
От: MAMOHT  
Дата: 02.07.13 13:03
Оценка:
Здравствуйте, STDray, Вы писали:

STD>Или еще вот так можно


STD>
STD>def vv = Card.ValencyDict.Select(_.Value).Find(_ == v).WithDefault(-1);
STD>


Не. Ни один из вариантов не компилируется.
Вариант hardcase хорошо в плане читабельности. Но я про такую конструкцию еще не читал. Как называется этот механизм, не могу найти?

    def vv = res : {
        foreach(k in Card.ValencyDict.Keys)
            when( Card.ValencyDict[k] == v )
                res(k);
        -1;
    }
Re[4]: Избавляюсь от Nemerle.Imperative
От: STDray http://stdray.livejournal.com
Дата: 02.07.13 13:07
Оценка:
MAM>Не. Ни один из вариантов не компилируется.
Какой тип у Card.ValencyDict ?

MAM>Вариант hardcase хорошо в плане читабельности. Но я про такую конструкцию еще не читал. Как называется этот механизм, не могу найти?

Это именованные блоки.
Re[4]: Избавляюсь от Nemerle.Imperative
От: hi_octane Беларусь  
Дата: 02.07.13 13:11
Оценка:
MAM>Как называется этот механизм, не могу найти?

Блоки же
Re[5]: Избавляюсь от Nemerle.Imperative
От: MAMOHT  
Дата: 02.07.13 13:31
Оценка:
Здравствуйте, STDray, Вы писали:

MAM>>Не. Ни один из вариантов не компилируется.

STD>Какой тип у Card.ValencyDict ?

static _valDict: Dictionary[int, string] = Hashtable([ ...
Re[6]: Избавляюсь от Nemerle.Imperative
От: STDray http://stdray.livejournal.com
Дата: 02.07.13 14:02
Оценка:
MAM>static _valDict: Dictionary[int, string] = Hashtable([ ...

Вот. Исправил ошибку, подцепленную из одного из вариантов выше, где вместо ключа возвращалось значение. Любой из вариантов собирается.

        def dict = Hashtable.[int, string]();
        def v    = "sd";
        def vv   = dict.Find(kv => kv.Value == v).Map(_.Key).WithDefault(-1);
        def vv   = if(dict.Find(kv => kv.Value == v) is Some(x)) x.Key else -1;
        def vv   = dict.Where(kv => kv.Value == v).Select(_.Key).DefaultIfEmpty(-1).First();
        def vv   = dict.MapLazyFiltered(kv => kv.Value == v, _.Key).DefaultIfEmpty(-1).First();


Первый, наверное, самый идиоматичный.
Re[7]: Избавляюсь от Nemerle.Imperative
От: hardcase Пират http://nemerle.org
Дата: 02.07.13 14:10
Оценка:
Здравствуйте, STDray, Вы писали:

STD>Первый, наверное, самый идиоматичный.


Зато лишние выделения памяти
/* иЗвиНите зА неРовнЫй поЧерК */
Re[8]: Избавляюсь от Nemerle.Imperative
От: STDray http://stdray.livejournal.com
Дата: 02.07.13 14:17
Оценка:
STD>>Первый, наверное, самый идиоматичный.

H>Зато лишние выделения памяти


Под замыкания и option?
Re: Избавляюсь от Nemerle.Imperative
От: _NN_ www.nemerleweb.com
Дата: 02.07.13 19:04
Оценка:
Здравствуйте, MAMOHT, Вы писали:

MAM>Вот, пытаюсь переписать код из С#-style в правильный Nemerle.


Правильно было бы написать макрос: find
Автор: VladD2
Дата: 26.07.10
.
Это в духе Nemerle
И тогда код прост и быстр:
def vv = find (e when e.Value == v in Card.ValencyDict) k notfound -1;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: Избавляюсь от Nemerle.Imperative
От: STDray http://stdray.livejournal.com
Дата: 02.07.13 21:50
Оценка:
_NN>Правильно было бы написать макрос: find
Автор: VladD2
Дата: 26.07.10
.

_NN>Это в духе Nemerle
_NN>И тогда код прост и быстр:
_NN>
_NN>def vv = find (e when e.Value == v in Card.ValencyDict) k notfound -1;
_NN>

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