[Lib] Принимаются пожелания по стандартной библиотеке.
От: Klapaucius  
Дата: 28.07.10 07:38
Оценка:
В этом треде обсуждаются и принимаются пожелания по стандартной библиотеке. А именно по методам расширениям, интерфейсам, операторам, структурам данных, которые нужны вам в стандартной библиотеке, но по какой-то причине туда не включены или реализованы не так как вам нужно. Предложения по макросам пока принимаются где-нибудь в другом месте. Также желательно, я думаю, оформлять свои предложения в виде фич-реквеста в багтрекере.
... << RSDN@Home 1.2.0 alpha 4 rev. 1446>>
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Update для Hashtable и Map
От: WolfHound  
Дата: 28.07.10 13:17
Оценка: 16 (1)
Здравствуйте, Klapaucius, Вы писали:

    public Update (key : TKey, defaultValue : TValue, updateFn : TValue -> TValue) : Hashtable [TKey, TValue]
    {
      mutable value;

      unless (TryGetValue (key, out value))
        value = defaultValue;

      this[key] = updateFn(value);

      this;
    }

    public Update (key : TKey, newValue : void -> TValue, updateFn : TValue -> TValue) : Hashtable [TKey, TValue]
    {
      mutable value;

      unless (TryGetValue (key, out value))
        value = newValue();

      this[key] = updateFn(value);

      this;
    }

Очень удобно использовать совместно с fold
      def transitions = fsm.Transitions.Fold(Hashtable(), (transition : Transition, transitions) =>
        transitions.Update((transition.From, transition.To), (RangeSet(), false, false), (chars, end, epsilon) =>
          match (transition)
          {
          | Symbol(ch) => (ch.Sum(chars), end, epsilon);
          | End        => (chars, true, epsilon);
          | Epsilon    => (chars, end, true);
          }
        )
      );

      def transitions = fsm.Transitions.Fold(Hashtable(), (transition : Transition, transitions) =>
      {
        def key = (transition.From, transition.To);
        def (chars, end, epsilon) = match (transitions.Get(key))
        {
        | Some(value) => value;
        | None => (RangeSet(), false, false);
        }
        match (transition)
        {
        | Symbol(ch) => transitions[key] = (ch.Sum(chars), end, epsilon);
        | End        => transitions[key] = (chars, true, epsilon);
        | Epsilon    => transitions[key] = (chars, end, true);
        }
        transitions
      });
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: [Lib] Принимаются пожелания по стандартной библиотеке.
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.07.10 14:03
Оценка: 16 (1)
Здравствуйте, Klapaucius, Вы писали:

K>В этом треде обсуждаются и принимаются пожелания по стандартной библиотеке. А именно по методам расширениям, интерфейсам, операторам, структурам данных, которые нужны вам в стандартной библиотеке, но по какой-то причине туда не включены или реализованы не так как вам нужно. Предложения по макросам пока принимаются где-нибудь в другом месте. Также желательно, я думаю, оформлять свои предложения в виде фич-реквеста в багтрекере.


1. Последовательность (в именовании и не только).
2. Непротиворечивость (чтобы не было конфликтов с тем же System.Linq и 4-ым фрэймворком).
3. Определенность (чтобы все было интуитивно понятно).
4. Обоснованность (изменений и нововведений).

При принятии спорных решений лучше вынести обсуждение на публику (сюда, значич).

Желательно сделать специализированные реализации функций для разных видов коллекций (массивы, списки немерле, списки дотнета, хэш-таблицы) и общую для IEnumerable[T] которая бы динамически вызвала бы специализированные реализации. Например, так сделано для Map2ToArray:
    public Map2ToArray[First, Second, Result](
      [NotNull] this first  : Seq[First],
      [NotNull]      second : Seq[Second],
      [NotNull]      func   : First * Second -> Result
    )
      : array[Result]
    {
      match (first, second)
      {
        | (f is array[First], s is array[Second]) => Map2ToArray(f, s, func)
        | (f is SCG.ICollection[First], s is SCG.ICollection[Second]) => Map2ToArray(f.NToArray(), s.NToArray(), func)
        | (f is list[First], s is list[Second]) =>
           def foldFunc(left, right, (arr, index))
           {
             arr[index] = func(left, right);
             (arr, index + 1)
           }

           def (result, _) = f.FoldLeft2(s, (array(f.Length), 0), foldFunc);
           result

        | _ =>
          using (e1 = first.GetEnumerator(), e2 = second.GetEnumerator())
          {
            def loop (result) : array[Result]
            {
              match (e1.MoveNext(), e2.MoveNext())
              {
                | (true,   true) => result.Add(func(e1.Current, e2.Current)); loop(result)
                | (false, false) => result.NToArray()
                | (true,  false)
                | (false,  true) => throw System.ArgumentException("Collections must have the same length", "first, second");
              }
            }

            loop(SCG.List()).NToArray();
          }
      }
    }

    public Map2ToArray[First, Second, Result](
      [NotNull] this first : array[First],
      [NotNull] second : array[Second],
      [NotNull] func: First * Second -> Result
    )
      : array[Result]
    {
      when (first.Length != second.Length)
        throw System.ArgumentException("Collections must have the same length", "first, second");

      def result = array(first.Length);

      foreach (i in[0 .. first.Length - 1])
        result[i] = func(first[i], second[i]);

      result;
    }

    ...


В общем, чтобы (если это возможно) лучшая реализация выбиралась компилятором, а тип не известен на стадии компиляции, чтобы универсальная функция выбирала специализированную (по возможности) динамически.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Lib] Принимаются пожелания по стандартной библиотеке.
От: _nn_ www.nemerleweb.com
Дата: 15.08.10 15:35
Оценка: 14 (1)
Здравствуйте, Klapaucius, Вы писали:

K>В этом треде обсуждаются и принимаются пожелания по стандартной библиотеке. А именно по методам расширениям, интерфейсам, операторам, структурам данных, которые нужны вам в стандартной библиотеке, но по какой-то причине туда не включены или реализованы не так как вам нужно. Предложения по макросам пока принимаются где-нибудь в другом месте. Также желательно, я думаю, оформлять свои предложения в виде фич-реквеста в багтрекере.


Убрать дупликаты и колизии:

  • Nemerle.Collections.NList.NToList
  • Nemerle.Collections.NList.ToNList при чем принимает только массив
  • Nemerle.Core.list.ToList — совпадает с System.Linq.Enumerable.ToList
  • Nemerle.Core.list.AsList

    Нет методов принимающих System.Collections.IEnumerable, однако метод Cast надо брать из System.Linq, уже лишняя зависимость
  • http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re: [Lib] Принимаются пожелания по стандартной библиотеке.
    От: hardcase Пират http://nemerle.org
    Дата: 24.08.10 13:43
    Оценка: +1
    Здравствуйте, Klapaucius, Вы писали:

    Как успехи?
    /* иЗвиНите зА неРовнЫй поЧерК */
    Re[2]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: Klapaucius  
    Дата: 25.08.10 08:54
    Оценка: 53 (2)
    Здравствуйте, hardcase, Вы писали:

    H>Как успехи?


    Работы ведутся. С наработками и экспериментами можно ознакомиться тут. Принимаются предложения и критика в любой форме. Особенно приветствуются предложения по именованию, для разрешения конфликов с LINQ.
    ... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[3]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 25.08.10 12:40
    Оценка:
    Здравствуйте, Klapaucius, Вы писали:


    K>Принимаются предложения и критика в любой форме. Особенно приветствуются предложения по именованию, для разрешения конфликов с LINQ.


    Мне кажется что методы вроде:
        public FoldLeft[T](
          [NotNull] this arr : array[T],
          [NotNull] f : T * T -> T
        ) : T

    лучше назвать reduce, чтобы лучше отличать семантику.

    Кроме того FoldLeft настолько часто используется, что стоит ввести для него синоним Fold, или даже вообще отказаться от FoldLeft и использовать для его обозначения FoldLeft.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: Klapaucius  
    Дата: 26.08.10 12:29
    Оценка: 3 (2)
    Здравствуйте, VladD2, Вы писали:

    VD>Мне кажется что методы вроде:

    VD>
    VD>    public FoldLeft[T](
    VD>      [NotNull] this arr : array[T],
    VD>      [NotNull] f : T * T -> T
    VD>    ) : T
    VD>

    VD>лучше назвать reduce, чтобы лучше отличать семантику.

    Да, я думал об этом. Тем более, что в некоторых ML-ях, в F# например, он именно так и называется.
    Есть, кстати, одна проблема: что у FoldLeft, который сейчас в Nemerle, сворачивающая функция принимает элемент коллекции первым аргументом, а аккумулятор — вторым.
    По идее, левый фолд должен работать так:
    ["a", "b", "c"].FoldLeft("", _+_) == (("" + "a") + "b") + "c" == "abc"

    Он так не работает. Он работает так:
    ["a", "b", "c"].FoldLeft("", _+_) == "c" + ("b" + ("a" + "")) == "cba"

    Что совершенно неинтуитивно. У левой свертки функция должна быть
    аккумулятор * элемент -> аккумулятор

    ну а нынешний тип функции должен быть у FoldRight, тогда она будет работать, как и полагается правой свертке:
    [1, 2, 3].FoldRight([], _::_) == 1 :: (2 :: (3 :: [])) == [1, 2, 3]

    т.е. вообще-то надо бы поменять последовательность аргументов для левой свертки, но это ломающее изменение, череватое довольно неприятными ошибками.
    Старые функции для массивов и последовательностей можно оставить в другом пространстве имен, чтобы старый код не ломать, но ведь со списком-то это уже сложнее проделать (хотя можно, если вынести все такие функции методами-расширениями в отдельное пространство имен, а бессмысленные методы списка, вызывающие методы из NList (явный реликт времен без методов-расширений) убрать).

    VD>Кроме того FoldLeft настолько часто используется, что стоит ввести для него синоним Fold, или даже вообще отказаться от FoldLeft и использовать для его обозначения FoldLeft.


    Да, конечно, у меня запланированы синонимы без Left для FoldLeft, ScanLeft и прочего.
    ... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[5]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: hardcase Пират http://nemerle.org
    Дата: 26.08.10 13:55
    Оценка:
    Здравствуйте, Klapaucius, Вы писали:

    K>Да, я думал об этом. Тем более, что в некоторых ML-ях, в F# например, он именно так и называется.

    K>Есть, кстати, одна проблема: что у FoldLeft, который сейчас в Nemerle, сворачивающая функция принимает элемент коллекции первым аргументом, а аккумулятор — вторым.

    Да, да, много раз натыкался. Потому никак запомнить не могу их порядок.
    /* иЗвиНите зА неРовнЫй поЧерК */
    Re[3]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: catbert  
    Дата: 28.08.10 19:00
    Оценка:
    Здравствуйте, Klapaucius, Вы писали:

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


    H>>Как успехи?


    K>Работы ведутся. С наработками и экспериментами можно ознакомиться тут. Принимаются предложения и критика в любой форме. Особенно приветствуются предложения по именованию, для разрешения конфликов с LINQ.


    А почему MapSeq имеет двойника MapISeq, а Iter просто перегружен?
    Re[4]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: Klapaucius  
    Дата: 30.08.10 11:24
    Оценка:
    Здравствуйте, catbert, Вы писали:

    C>А почему MapSeq имеет двойника MapISeq, а Iter просто перегружен?


    Извините, не понял.
    ... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
    'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
    Re[5]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: catbert  
    Дата: 01.09.10 18:16
    Оценка:
    Здравствуйте, Klapaucius, Вы писали:

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


    C>>А почему MapSeq имеет двойника MapISeq, а Iter просто перегружен?


    K>Извините, не понял.


    Ээ, это я буковки не увидел, извините
    Re[3]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 30.09.10 20:48
    Оценка: 16 (1)
    Здравствуйте, Klapaucius, Вы писали:

    K>Принимаются предложения и критика в любой форме.


    В Nemerle.Collections.Set[T] надо добавить методы:
    IsSupersetOf, IsSubsetOf, IsProperSubsetOf, IsProperSupersetOf (что означает "Proper" я и сам не понимаю, но наверно они тоже нужны). Ну, и возможно другие методы из System.Collections.Generic.HashSet[T].

    А то до смешного доходит. Сегодня от лени написал вот такой код:
    mutable min = recSets.NFirst();
    
    foreach (s in recSets.Skip(1))
      when (HashSet(min).IsSupersetOf(HashSet(s)))
        min = s;

    и сам же ужаснулся.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[4]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: catbert  
    Дата: 01.10.10 17:56
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>(что означает "Proper" я и сам не понимаю, но наверно они тоже нужны).


    "Proper" означает "строгий" (ну, то есть {A, B} не является строгим подмножеством {A, B}).
    Re[5]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 01.10.10 18:22
    Оценка:
    Здравствуйте, catbert, Вы писали:

    VD>>(что означает "Proper" я и сам не понимаю, но наверно они тоже нужны).


    C>"Proper" означает "строгий" (ну, то есть {A, B} не является строгим подмножеством {A, B}).


    Какая-то дурацкая терминология. Мне кажется логично было бы называть это эксклюзивным или нет.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[6]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: SergASh  
    Дата: 02.10.10 19:30
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Какая-то дурацкая терминология. Мне кажется логично было бы называть это эксклюзивным или нет.


    Это математическая терминология, она постарше нас будет, так что лучше ее не клеймить. Подумай об аналогии со строгим и нестрогим неравенством.
    Re[7]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 02.10.10 20:21
    Оценка:
    Здравствуйте, SergASh, Вы писали:

    SAS>Это математическая терминология, она постарше нас будет, так что лучше ее не клеймить. Подумай об аналогии со строгим и нестрогим неравенством.


    Я всегда не доверял английским спец шко... математической терминалогии. Складывается ощущине, что люди специально шыфруются.

    В программировании традиции именования почерпнутые из математики неизменно приводят к проблемам.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: [Lib] Принимаются пожелания по стандартной библиотеке.
    От: _nn_ www.nemerleweb.com
    Дата: 04.10.10 11:09
    Оценка: 16 (1)
    Здравствуйте, Klapaucius, Вы писали:

    K>В этом треде обсуждаются и принимаются пожелания по стандартной библиотеке. А именно по методам расширениям, интерфейсам, операторам, структурам данных, которые нужны вам в стандартной библиотеке, но по какой-то причине туда не включены или реализованы не так как вам нужно. Предложения по макросам пока принимаются где-нибудь в другом месте. Также желательно, я думаю, оформлять свои предложения в виде фич-реквеста в багтрекере.


    Сигнатура IterI:

    Nemerle.Collections: public IterI T(this arr : array T, f : int * T -&gt; void) : void
    list: public IterI (mutable acc : int, f : int * T -&gt; void) : void

    Нужен IterI с одинаковой сигнатурой для всех.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[8]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: catbert  
    Дата: 04.10.10 17:29
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    +1. Но в этом случае вряд ли можно придумать лучшую альтернативу.
    Re[2]: [Lib] Принимаются пожелания по стандартной библиотеке
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 04.10.10 18:16
    Оценка:
    Здравствуйте, _nn_, Вы писали:


    Думаю, acc тут лишнее.
    __>list: public IterI (mutable acc : int, f : int * T -&gt; void) : void

    Откровенно говоря по мне так все эти Iter-ы нужно просто выбросить.
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.