Re[11]: Логическое программирование в Nemerle?
От: Константин Л. Франция  
Дата: 11.06.07 13:08
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>>
  
VD>  public IsEmpty[T](this seq : SCG.IEnumerable[T])             : bool
VD>  {
VD>    | []                                    => true
VD>    | _ :: _                                => false
VD>    | ary is array[T]                       => IsEmpty(ary)
VD>    | col is System.Collections.ICollection => IsEmpty(col)
VD>    | null                                  => true
VD>    | _                                     =>
VD>      foreach (_ in seq) // This for call IDisposable...
VD>        Nemerle.Imperative.Return(false);
VD>      true
VD>  }
VD>}
VD>


а это зачем?
Re[12]: Логическое программирование в Nemerle?
От: VladD2 Российская Империя www.nemerle.org
Дата: 11.06.07 14:15
Оценка: 10 (2)
Здравствуйте, Константин Л., Вы писали:


КЛ>VD> foreach (_ in seq) // This for call IDisposable...

VD>> Nemerle.Imperative.Return(false);
VD>> true


КЛ>а это зачем?


Интерфейс System.Collections.Generic.IEnumerator[T] унаследован от System.IDisposable и какой-нибудь оригинал может расчитывать на то, что в конце итерации будет вызван Dispose(). Чтобы не напрягаться и не прописывать вызов явно я воспользовался foreach-чем который хотя и макрос, но отрабатывает эту логику как и встроенный оператор foreach в C#.

Ну, а Nemerle.Imperative.Return(false) — это такой способ вызвать макрос return (заменяющий оператор return из Шарпа). В данном случае я зада полностью квалифицированное имя и у меня не будет проблем если я этот код скопирую в модуль где не открыто пространство имен Nemerle.Imperative. В принципе, можно заменить этот код на:
foreach (_ in seq) // This for call IDisposable...
    return false;
true

но перед этим прийдется открыть (using-ом) пространство имен Nemerle.Imperative.

По умолчанию return, break и contunue не доступны, чтобы люди приучались писать в фукнциональном стиле и допускли меньше ошибок. Чтобы их использовать открыть Nemerle.Imperative.

В приципе этот код можно было бы записать на блоках:
return: 
{
    foreach (_ in seq) // This for call IDisposable...
        return(false);
    true
}
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Логическое программирование в Nemerle?
От: Klapaucius  
Дата: 13.06.07 12:15
Оценка:
Здравствуйте, IO, Вы писали:

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


M>>И было-бы неплохо, чтоб find возвращал не все возможные решения, а по одному. А то если все сразу — это на практике будет очень долго.

IO>Мне тоже интересно, можно ли тут прикрутить ленивое вычисление.

Попробуйте FilterLazy из Nemerle.Utility
... << RSDN@Home 1.2.0 alpha rev. 677>>
'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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.