В этом треде обсуждаются и принимаются пожелания по стандартной библиотеке. А именно по методам расширениям, интерфейсам, операторам, структурам данных, которые нужны вам в стандартной библиотеке, но по какой-то причине туда не включены или реализованы не так как вам нужно. Предложения по макросам пока принимаются где-нибудь в другом месте. Также желательно, я думаю, оформлять свои предложения в виде фич-реквеста в багтрекере.
... << 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
Здравствуйте, 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] Принимаются пожелания по стандартной библиотеке.
Здравствуйте, 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, уже лишняя зависимость
Работы ведутся. С наработками и экспериментами можно ознакомиться тут. Принимаются предложения и критика в любой форме. Особенно приветствуются предложения по именованию, для разрешения конфликов с 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] Принимаются пожелания по стандартной библиотеке
K>Принимаются предложения и критика в любой форме. Особенно приветствуются предложения по именованию, для разрешения конфликов с LINQ.
Мне кажется что методы вроде:
public FoldLeft[T](
[NotNull] this arr : array[T],
[NotNull] f : T * T -> T
) : T
лучше назвать reduce, чтобы лучше отличать семантику.
Кроме того FoldLeft настолько часто используется, что стоит ввести для него синоним Fold, или даже вообще отказаться от FoldLeft и использовать для его обозначения FoldLeft.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Lib] Принимаются пожелания по стандартной библиотеке
Здравствуйте, 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, сворачивающая функция принимает элемент коллекции первым аргументом, а аккумулятор — вторым.
По идее, левый фолд должен работать так:
т.е. вообще-то надо бы поменять последовательность аргументов для левой свертки, но это ломающее изменение, череватое довольно неприятными ошибками.
Старые функции для массивов и последовательностей можно оставить в другом пространстве имен, чтобы старый код не ломать, но ведь со списком-то это уже сложнее проделать (хотя можно, если вынести все такие функции методами-расширениями в отдельное пространство имен, а бессмысленные методы списка, вызывающие методы из 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] Принимаются пожелания по стандартной библиотеке
Здравствуйте, Klapaucius, Вы писали:
K>Да, я думал об этом. Тем более, что в некоторых ML-ях, в F# например, он именно так и называется. K>Есть, кстати, одна проблема: что у FoldLeft, который сейчас в Nemerle, сворачивающая функция принимает элемент коллекции первым аргументом, а аккумулятор — вторым.
Да, да, много раз натыкался. Потому никак запомнить не могу их порядок.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: [Lib] Принимаются пожелания по стандартной библиотеке
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, hardcase, Вы писали:
H>>Как успехи?
K>Работы ведутся. С наработками и экспериментами можно ознакомиться тут. Принимаются предложения и критика в любой форме. Особенно приветствуются предложения по именованию, для разрешения конфликов с LINQ.
А почему MapSeq имеет двойника MapISeq, а Iter просто перегружен?
Re[4]: [Lib] Принимаются пожелания по стандартной библиотеке
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, catbert, Вы писали:
C>>А почему MapSeq имеет двойника MapISeq, а Iter просто перегружен?
K>Извините, не понял.
Ээ, это я буковки не увидел, извините
Re[3]: [Lib] Принимаются пожелания по стандартной библиотеке
Здравствуйте, 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, Вы писали:
VD>>(что означает "Proper" я и сам не понимаю, но наверно они тоже нужны).
C>"Proper" означает "строгий" (ну, то есть {A, B} не является строгим подмножеством {A, B}).
Какая-то дурацкая терминология. Мне кажется логично было бы называть это эксклюзивным или нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Lib] Принимаются пожелания по стандартной библиотеке
Здравствуйте, SergASh, Вы писали:
SAS>Это математическая терминология, она постарше нас будет, так что лучше ее не клеймить. Подумай об аналогии со строгим и нестрогим неравенством.
Я всегда не доверял английским спец шко... математической терминалогии. Складывается ощущине, что люди специально шыфруются.
В программировании традиции именования почерпнутые из математики неизменно приводят к проблемам.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Lib] Принимаются пожелания по стандартной библиотеке.
Здравствуйте, Klapaucius, Вы писали:
K>В этом треде обсуждаются и принимаются пожелания по стандартной библиотеке. А именно по методам расширениям, интерфейсам, операторам, структурам данных, которые нужны вам в стандартной библиотеке, но по какой-то причине туда не включены или реализованы не так как вам нужно. Предложения по макросам пока принимаются где-нибудь в другом месте. Также желательно, я думаю, оформлять свои предложения в виде фич-реквеста в багтрекере.