[Snippets] Nemerle.Diff
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.12.10 16:34
Оценка: 12 (2)
Выложил в сниппеты реализацию Diff-Patch-Match в виде методов-расширений к массивам IEquatable элементов:

public Diff[T](
        [NotNull] this sequenceA : array[T], 
        [NotNull]      sequenceB : array[T]
): array[DiffItem[T]]
where T : IEquatable[T]

— возвращает последовательность "разниц": наборов операций удаления и вставки, необходимых для получения sequenceB из sequenceA.

public Patch[T](
        [NotNull] this sequenceA : array[T], 
        [NotNull]      diffData  : array[DiffItem[T]]
) : array[T]

— обратная операция: по последовательности "разниц" и переданной sequenceA, строит sequenceB.

public Match[T](
        [NotNull] this sequenceA : array[T], 
        [NotNull]      sequenceB : array[T]
) : double

— определяет коэффициент соответствия между sequenceA и sequenceB (от 0.0 — полностью различны, до 1.0 — полностью идентичны). Оригинальный Match из этой триады операций с последовательностями делает "несколько" больше, но для моих задач было нужно именно это.

Простенькая демка:



и основные тесты включены, будут вопросы — welcome.

P.S: Массивы и императивщина чуть более, чем везде, но я в домике не программер, мне можно :-P
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re: [Snippets] Nemerle.Diff
От: catbert  
Дата: 06.12.10 16:56
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Выложил в сниппеты реализацию Diff-Patch-Match в виде методов-расширений к массивам IEquatable элементов:


KV>
KV>public Diff[T](
KV>        [NotNull] this sequenceA : array[T], 
KV>        [NotNull]      sequenceB : array[T]
KV>): array[DiffItem[T]]
KV>where T : IEquatable[T]
KV>

KV>- возвращает последовательность "разниц": наборов операций удаления и вставки, необходимых для получения sequenceB из sequenceA.

KV>и основные тесты включены, будут вопросы — welcome.


А массивы почему? Ну, то есть не IList[T].
Re[2]: [Snippets] Nemerle.Diff
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.12.10 17:05
Оценка:
Здравствуйте, catbert, Вы писали:

C>А массивы почему? Ну, то есть не IList[T].


Это выдернуто из бОльшего проекта, где используются именно массивы by-design Это во-первых, а во-вторых, потому что я в домике:

public Patch[T](
        [NotNull] this sequenceA : IList[T], 
        [NotNull]      diffData  : array[DiffItem[T]]
) : IList[T]


я не знаю, как в коде метода создавать экземпляр выделенного
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[3]: [Snippets] Nemerle.Diff
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.12.10 17:15
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>я не знаю, как в коде метода создавать экземпляр выделенного


*чтоб не решили, что я в танке, а не в домике* я в курсе, что экземпляр интерфейса создать нельзя, но я хз, как правильно в nemerle описать контракт такого метода и как его реализовать.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[3]: [Snippets] Nemerle.Diff
От: hardcase Пират http://nemerle.org
Дата: 06.12.10 17:19
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>
KV>public Patch[T](
KV>        [NotNull] this sequenceA : IList[T], 
KV>        [NotNull]      diffData  : array[DiffItem[T]]
KV>) : IList[T]
KV>


KV>я не знаю, как в коде метода создавать экземпляр выделенного


System.Collections.Generic.List[T] ?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: [Snippets] Nemerle.Diff
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.12.10 17:26
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, kochetkov.vladimir, Вы писали:


KV>>
KV>>public Patch[T](
KV>>        [NotNull] this sequenceA : IList[T], 
KV>>        [NotNull]      diffData  : array[DiffItem[T]]
KV>>) : IList[T]
KV>>


KV>>я не знаю, как в коде метода создавать экземпляр выделенного


H>System.Collections.Generic.List[T] ?


Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[5]: [Snippets] Nemerle.Diff
От: hardcase Пират http://nemerle.org
Дата: 06.12.10 18:04
Оценка: 26 (1)
Здравствуйте, kochetkov.vladimir, Вы писали:

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


H>>Здравствуйте, kochetkov.vladimir, Вы писали:


KV>>>
KV>>>public Patch[T](
KV>>>        [NotNull] this sequenceA : IList[T], 
KV>>>        [NotNull]      diffData  : array[DiffItem[T]]
KV>>>) : IList[T]
KV>>>


KV>>>я не знаю, как в коде метода создавать экземпляр выделенного


H>>System.Collections.Generic.List[T] ?


KV>Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).


Вот такая конструкция мне видится допустимой:
public Patch[TCollection, TItem](
        [NotNull] this sequenceA : TCollection, 
        [NotNull]      diffData  : array[DiffItem[T]]
) : TCollection
wherw TCollection: IList[TItem], new()
/* иЗвиНите зА неРовнЫй поЧерК */
Re: [Snippets] Nemerle.Diff
От: hardcase Пират http://nemerle.org
Дата: 06.12.10 20:17
Оценка: 13 (1)
Здравствуйте, kochetkov.vladimir, Вы писали:

Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы).
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: [Snippets] Nemerle.Diff
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.12.10 22:19
Оценка:
Здравствуйте, hardcase, Вы писали:

KV>>Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).


H>Вот такая конструкция мне видится допустимой:

H>
H>public Patch[TCollection, TItem](
H>        [NotNull] this sequenceA : TCollection, 
H>        [NotNull]      diffData  : array[DiffItem[T]]
H>) : TCollection
H>wherw TCollection: IList[TItem], new()
H>


Да, это оно и есть, пасиб. Правда внезапно обнаружились еще две фигни: во-первых, у массивов нет конструкторов без параметров, а во-вторых, реализация некоторых методов IList в массивах, типа Add() выбрасывает NotImplemented (ну, понятно почему, в приницпе). Следовательно и способы формирования sequenceB для массивов и всего остального будут отличаться: для массивов это будет просто Array.Copy из оригинальной последовательности и элементов diff, а для прочих IList'ов — последовательное добавление элементов
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: [Snippets] Nemerle.Diff
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 06.12.10 22:19
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, kochetkov.vladimir, Вы писали:


H>Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы).


Кстати, а зачем они вообще по умолчанию включены в шаблоне проекта для релиза?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[3]: [Snippets] Nemerle.Diff
От: _FRED_ Черногория
Дата: 07.12.10 09:54
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

H>>Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы).

KV>Кстати, а зачем они вообще по умолчанию включены в шаблоне проекта для релиза?

Так сделано для шарповых проектов, например. А чем они мешают-то? Неужели места на диске много занимают?
Help will always be given at Hogwarts to those who ask for it.
Re[5]: [Snippets] Nemerle.Diff
От: _FRED_ Черногория
Дата: 07.12.10 09:57
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>>>public Patch[T](
KV>>>        [NotNull] this sequenceA : IList[T], 
KV>>>        [NotNull]      diffData  : array[DiffItem[T]]
KV>>>) : IList[T]

KV>>>я не знаю, как в коде метода создавать экземпляр выделенного
H>>System.Collections.Generic.List[T] ?

KV>Тип возвращаемого значения должен быть в точности таким же, как у sequenceA (которая в рассматриваемом сценарии может быть как List[T], так и массивом).


А всвязи с чем такое странное требование?

Да и констрейнт (данный ниже
Автор: hardcase
Дата: 06.12.10
) данной гарантии не обеспечит: во время компидляции рантаймовый тип sequenceA может отличаться от того, что вычислит компилятор или пользователь при вызове укажет явно, не смотря на ограничение new().
Help will always be given at Hogwarts to those who ask for it.
Re[4]: [Snippets] Nemerle.Diff
От: _nn_ www.nemerleweb.com
Дата: 07.12.10 10:01
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, kochetkov.vladimir, Вы писали:


H>>>Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы).

KV>>Кстати, а зачем они вообще по умолчанию включены в шаблоне проекта для релиза?

_FR>Так сделано для шарповых проектов, например. А чем они мешают-то? Неужели места на диске много занимают?


На самом деле проблема что в Nemerle нельзя скомпилировать Release с PDB как в C#: http://rsdn.ru/forum/nemerle/4007768.1.aspx
Автор: VladD2
Дата: 21.10.10
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: [Snippets] Nemerle.Diff
От: hardcase Пират http://nemerle.org
Дата: 07.12.10 10:31
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, kochetkov.vladimir, Вы писали:


H>>>Поправил сборку солюшена в релизной конфигурации (отключил дебаг символы).

KV>>Кстати, а зачем они вообще по умолчанию включены в шаблоне проекта для релиза?

_FR>Так сделано для шарповых проектов, например. А чем они мешают-то? Неужели места на диске много занимают?


Тем что в C# проектах за отладочную информацию отвечает параметр <DebugType>, он имеет 3 значения: Full, None, PdbOnly. А в немерловых — <DebugSymbols>, он имеет только два значения: true, false. Таким образом, если включить <DebugSymbols> в релизе, то никаких оптимизаций рантайма не получим. Блудов как-то хотел сделать как в C#, при условии что "ему объяснят зачем нужен pdb в релизе".
/* иЗвиНите зА неРовнЫй поЧерК */
Re[6]: [Snippets] Nemerle.Diff
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 07.12.10 10:39
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>А всвязи с чем такое странное требование?


Patch(a, Diff(a,b)) должно возвращать b, разве нет?

_FR>Да и констрейнт (данный ниже
Автор: hardcase
Дата: 06.12.10
) данной гарантии не обеспечит: во время компидляции рантаймовый тип sequenceA может отличаться от того, что вычислит компилятор или пользователь при вызове укажет явно, не смотря на ограничение new().


Вот поэтому там массивы В них можно преобразовать любую последовательность, а для большинства членов System.IO они являются "родным типом", что в моих задачах немаловажно, т.к. там имеет место интенсивная работа с огромными файлами.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.