Re[2]: Новая Дельфа
От: hattab  
Дата: 26.10.10 17:59
Оценка:
Здравствуйте, TimurSPB, Вы писали:

TSP> В общем пока все возятся со всякими Java/C#/C++, в мире Дельфи уже наступило светлое будущее (пока 32-х битное правда)!


Йоу! Последние сводки с фронта:

Milestone: 64bit compiler now merged into the main dev branch! All devs are now locked and loaded!

avalon 1.0rc3 rev 363, zlib 1.2.3
Re[29]: Почему Delphi всё еще жив?!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 26.10.10 21:17
Оценка:
Здравствуйте, enji, Вы писали:

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


HA>>>Еще не сдаюсь

HA>>>Оценка сложности DFS O(N+E), N — число вершин, E — число связей.
HA>>>E может быть от 0 до O(N^2)
HA>>>То есть какие-то патологические ситуации все-таки возможны.

G>>Еще раз. Все вершины проходятся максимум один раз.

G>>Количество связей значение не имеет.

E>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся

Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим
Re[3]: Новая Дельфа
От: TimurSPB Интернет  
Дата: 26.10.10 21:18
Оценка:
Здравствуйте, hattab, Вы писали:

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


TSP>> В общем пока все возятся со всякими Java/C#/C++, в мире Дельфи уже наступило светлое будущее (пока 32-х битное правда)!


H>Йоу! Последние сводки с фронта:

H>

Milestone: 64bit compiler now merged into the main dev branch! All devs are now locked and loaded!


Это здорово. Я очень рад.
Make flame.politics Great Again!
Re[12]: ЧОЧО?
От: Ночной Смотрящий Россия  
Дата: 26.10.10 22:06
Оценка:
Здравствуйте, swame, Вы писали:

S>http://sourceforge.net/projects/tpapro/


Предлагаю, прежде чем отвечать, ознакомится хотя бы с этим:
http://channel9.msdn.com/blogs/charles/erik-meijer-rx-in-15-minutes
Re[38]: ЧОЧО?
От: Ночной Смотрящий Россия  
Дата: 26.10.10 22:09
Оценка:
Здравствуйте, hattab, Вы писали:

H>И часто за тебя компилер MoveNext() реализует?


В случае шарпа примерно в 100% случаев.
Re[39]: ЧОЧО?
От: hattab  
Дата: 26.10.10 23:08
Оценка:
Здравствуйте, Ночной Смотрящий, Вы писали:

НС> H>И часто за тебя компилер MoveNext() реализует?


НС> В случае шарпа примерно в 100% случаев.


Не вызовы MoveNext(), а непосредственно сам метод.
avalon 1.0rc3 rev 363, zlib 1.2.3
Re[40]: ЧОЧО?
От: -_*  
Дата: 27.10.10 02:41
Оценка:
Здравствуйте, hattab, Вы писали:

НС>> В случае шарпа примерно в 100% случаев.


H>Не вызовы MoveNext(), а непосредственно сам метод.


Всегда. Что бы было понятно

public Item GetNextItem()
{
  return new Item();
}

Как ты думаешь, что это такое ? В дотнет это почти последовательность — если вызвать n-раз. Что бы стало по настоящему последовательностью, нужно заставить компилятор генерировать чуток кода:
public IEnumarable<Item> GetNextItem()
{
  while(true)
  {
      yeild return new Item();
  }
}

Если хочешь узнать, как это работает, нужно запустить ну хотя бы тот же reflector. Если коротко, то будет сгенерирован класс, который реализует IEnumarable, код выше реально будет заменен на примерно следующий
class GetNextItemEnumerator : IEnumerable<Item>,...
{
  Item current = null;
    public bool MoveNext()
    {
       this.current = new Item();
       return true;
    }
    public Item Current
    {
       get
       {
           return this.current;
       }
    }
    ...
}

Все просто и никаких "структур" не надо.

foreach(Item item in GetNextItem())
{
// бесконечный цикл создания объектов
// со "структурами" на это памяти не хватит
}

Можно идти и дальше — обход любой сложной структуры вроде дерева, кольца, графа или генерация сложной последовательности делается довольно просто. А вот в Дельфи с итераторами придется попотеть.
Материал из Википедии — свободной энциклопедии, -_*
Re[41]: ЧОЧО?
От: hattab  
Дата: 27.10.10 04:01
Оценка:
Здравствуйте, -_*, Вы писали:

-_*> НС>> В случае шарпа примерно в 100% случаев.

-_*> H>Не вызовы MoveNext(), а непосредственно сам метод.

-_*> Всегда. Что бы было понятно

-_*>
-_*> public Item GetNextItem()
-_*> {
-_*>   return new Item();
-_*> }
-_*>

-_*> Как ты думаешь, что это такое ? В дотнет это почти последовательность — если вызвать n-раз. Что бы стало по настоящему последовательностью, нужно заставить компилятор генерировать чуток кода:
-_*>
-_*> public IEnumarable<Item> GetNextItem()
-_*> {
-_*>   while(true)
-_*>   {
-_*>       yeild return new Item();
-_*>   }
-_*> }
-_*>

-_*> Если хочешь узнать, как это работает, нужно запустить ну хотя бы тот же reflector. Если коротко, то будет сгенерирован класс, который реализует IEnumarable, код выше реально будет заменен на примерно следующий
-_*>
-_*> class GetNextItemEnumerator : IEnumerable<Item>,...
-_*> {
-_*>   Item current = null;
-_*>     public bool MoveNext()
-_*>     {
-_*>        this.current = new Item();
-_*>        return true;
-_*>     }
-_*>     public Item Current
-_*>     {
-_*>        get
-_*>        {
-_*>            return this.current;
-_*>        }
-_*>     }
-_*>     ...
-_*> }
-_*>

-_*> Все просто и никаких "структур" не надо.

Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?

-_*>
-_*> foreach(Item item in GetNextItem())
-_*> {
-_*> // бесконечный цикл создания объектов
-_*> // со "структурами" на это памяти не хватит
-_*> }
-_*>

-_*> Можно идти и дальше — обход любой сложной структуры вроде дерева, кольца, графа или генерация сложной последовательности делается довольно просто.

Хм, что же в таком случае заставляет разработчиков самостоятельно писать перечислители?
  "Кусок кода"
namespace CookComputing.XmlRpc
{
  public class XmlRpcStruct : Hashtable
  {
    private ArrayList _keys = new ArrayList();
    private ArrayList _values = new ArrayList();

    public override void Add(object key, object value)
    {
      if (!(key is string))
      {
        throw new ArgumentException("XmlRpcStruct key must be a string.");
      }
      if (XmlRpcServiceInfo.GetXmlRpcType(value.GetType())
          == XmlRpcType.tInvalid)
      {
        throw new ArgumentException(String.Format(
          "Type {0} cannot be mapped to an XML-RPC type", value.GetType()));
      }
      base.Add(key, value);
      _keys.Add(key);
      _values.Add(value);
    }

    public override object this[object key]
    {
      get
      {
        return base[key];
      }
      set
      {
        if (!(key is string))
        {
          throw new ArgumentException("XmlRpcStruct key must be a string.");
        }
        if (XmlRpcServiceInfo.GetXmlRpcType(value.GetType())
            == XmlRpcType.tInvalid)
        {
          throw new ArgumentException(String.Format(
            "Type {0} cannot be mapped to an XML-RPC type", value.GetType()));
        }
        base[key] = value;
        _keys.Add(key);
        _values.Add(value);
      }
    }

    public override bool Equals(Object obj)
    {
      if (obj.GetType() != typeof(XmlRpcStruct))
        return false;
      XmlRpcStruct xmlRpcStruct = (XmlRpcStruct)obj;
      if (this.Keys.Count != xmlRpcStruct.Count)
        return false;
      foreach (String key in this.Keys)
      {
        if (!xmlRpcStruct.ContainsKey(key))
          return false;
        if (!this[key].Equals(xmlRpcStruct[key]))
          return false;
      }
      return true;
    }

    public override int GetHashCode()
    {
      int hash = 0;
      foreach (object obj in Values)
      {
        hash ^= obj.GetHashCode();
      }
      return hash;
    }

    public override void Clear()
    {
      base.Clear();
      _keys.Clear();
      _values.Clear();
    }

    public new IDictionaryEnumerator GetEnumerator()
    {
      return new XmlRpcStruct.Enumerator(_keys, _values);
    }

    public override ICollection Keys
    {
      get
      {
        return _keys;
      }
    }

    public override void Remove(object key)
    {
      base.Remove(key);
      int idx = _keys.IndexOf(key);
      if (idx >= 0)
      {
        _keys.RemoveAt(idx);
        _values.RemoveAt(idx);
      }
    }

    public override ICollection Values
    {
      get
      {
        return _values;
      }
    }

    private class Enumerator : IDictionaryEnumerator
    {
      private ArrayList _keys;
      private ArrayList _values;
      private int _index;

      public Enumerator(ArrayList keys, ArrayList values)
      {
        _keys = keys;
        _values = values;
        _index = -1;
      }

      public void Reset()
      {
        _index = -1;
      }

      public object Current
      {
        get
        {
          CheckIndex();
          return new DictionaryEntry(_keys[_index], _values[_index]);
        }
      }

      public bool MoveNext()
      {
        _index++;
        if (_index >= _keys.Count)
          return false;
        else
          return true;
      }

      public DictionaryEntry Entry
      {
        get
        {
          CheckIndex();
          return new DictionaryEntry(_keys[_index], _values[_index]);
        }
      }

      public object Key
      {
        get
        {
          CheckIndex();
          return _keys[_index];
        }
      }

      public object Value
      {
        get
        {
          CheckIndex();
          return _values[_index];
        }
      }

      private void CheckIndex()
      {
        if (_index < 0 || _index >= _keys.Count)
          throw new InvalidOperationException(
            "Enumeration has either not started or has already finished.");
      }
    }
  }
}


-_*> А вот в Дельфи с итераторами придется попотеть.

Реализация одного метода это попотеть?
avalon 1.0rc3 rev 363, zlib 1.2.3
Re[42]: ЧОЧО?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.10 05:23
Оценка:
Здравствуйте, hattab, Вы писали:

H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?

Ну покажи полный аналог для такого
Автор: gandjustas
Дата: 26.10.10
например.
Re[2]: Новая Дельфа
От: An arbitrary organic compound  
Дата: 27.10.10 05:39
Оценка: :))
Здравствуйте, TimurSPB, Вы писали:

TSP>Слоган на странице продукта вообще отличный — "Be Amazing"


Интересно, а велосипеды у них на баннерах неспроста?
Re[43]: ЧОЧО?
От: hattab  
Дата: 27.10.10 05:45
Оценка:
Здравствуйте, gandjustas, Вы писали:

g> H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?


g> Ну покажи полный аналог для такого
Автор: gandjustas
Дата: 26.10.10
например.


Т.е. ты мне на полном серьезе предлагаешь тут реализовать собственный Rx? Шутник, однако.
avalon 1.0rc3 rev 363, zlib 1.2.3
Re[31]: ЧОЧО?
От: enji  
Дата: 27.10.10 06:06
Оценка:
Здравствуйте, -_*, Вы писали:

-_*>Здравствуйте, enji, Вы писали:

E>>И в чем проблема? Ловим событие мыши, кидаем в очередь, зовем функцию сверки с образцом или серию таких функций. Совпало с чем-то — удаляем совпадение, делаем действие по данному совпадению, продолжаем. Не совпало ни с чем — продолжаем ловить. Не подходит ни под оидн образец — удаляем первый элемент, повторяем проверку.


-_*>Это устаревший, низкоуровневый подход. Можно вот так
Что ты говоришь И что в нем такого устаревшего?

-_*>
-_*>events
-_*>    .Where(x => IsClean(x))
-_*>    .Select(x => Location.FromEventArgs(x))
-_*>    .SkipUntil(start)
-_*>    .TakeUntil(stop)
-_*>    .Repeat();
-_*>


ну и что? После того, как я оформлю свой подход в либу, для пользователя он будет выглядеть не сильно страшнее твоего кода

-_*>Серия эвентов преобразуется в последовательность координат. Это + еще кое что есть распознавание мышиных жестов. В нативном подходе, с очередями, совпадениями, надо было писать килобайты ифов, свичей, обработчиков и трястись над различными флагами.

Распознавание мышиных жестов в дельфях из коробки. Килобайтов ифов там нет...

-_*>Расширение вроде RX написать на коленке ?

Ты не поверишь, но RX тоже кто-то написал
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[30]: Почему Delphi всё еще жив?!
От: enji  
Дата: 27.10.10 06:06
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>>>Количество связей значение не имеет.


E>>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся

G>Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим

Ну т.е. кол-во связей значение таки имеет

На самом деле может быть даже больше N^2


class A;

class B
{
  public A a1, a2, a3, a4, a5;
};

A a = new A;
B b = new B;
b.a1 = a; b.a2 = a; ...
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[31]: Почему Delphi всё еще жив?!
От: Head Ache  
Дата: 27.10.10 06:37
Оценка:
Здравствуйте, enji, Вы писали:

E>На самом деле может быть даже больше N^2


число ребер в полном графе N(N-1)/2 — легко проверить.

Осталось уточнить — что фреймворк считает за связи.
Например, сколько связей для главного окна, элемента дерева или для переменной в рекурсивной процедуре.
Не может ли в каких-то ситуациях число связей расти сильнее O(N).
Этот аккаунт покинут.
Re[31]: ЧОЧО?
От: enji  
Дата: 27.10.10 06:47
Оценка:
Здравствуйте, -_*, Вы писали:

-_*>Серия эвентов преобразуется в последовательность координат. Это + еще кое что есть распознавание мышиных жестов.

скорее так: это + ЕЩЕ ДОФИГА ЧЕГО

В распознавании мышиных жестов самое интересное — не запись событий мыши и преобразования в посл координат (что тривиально), а алгоритмы распознавания; которые, как я сильно подозреваю, мало зависят от языка программирования
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[32]: Почему Delphi всё еще жив?!
От: enji  
Дата: 27.10.10 06:53
Оценка:
Здравствуйте, Head Ache, Вы писали:

HA>число ребер в полном графе N(N-1)/2 — легко проверить.


HA>Осталось уточнить — что фреймворк считает за связи.

HA>Например, сколько связей для главного окна, элемента дерева или для переменной в рекурсивной процедуре.
HA>Не может ли в каких-то ситуациях число связей расти сильнее O(N).

И что считает за вершины. В моем примере 2 объекта и 5 ссылок.

Если вершина — это объект, а ребро — это ссылка, то получается что не N(N-1)/2
... << RSDN@Home 1.2.0 alpha 4 rev. 1476>>
Re[44]: ЧОЧО?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.10 07:19
Оценка:
Здравствуйте, hattab, Вы писали:

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


g>> H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?


g>> Ну покажи полный аналог для такого
Автор: gandjustas
Дата: 26.10.10
например.


H>Т.е. ты мне на полном серьезе предлагаешь тут реализовать собственный Rx? Шутник, однако.


Нет, конкретный пример повтори с итератором, можно без асинхронности.
Re[31]: Почему Delphi всё еще жив?!
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 27.10.10 07:21
Оценка:
Здравствуйте, enji, Вы писали:

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


G>>>>Количество связей значение не имеет.


E>>>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся

G>>Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим

E>Ну т.е. кол-во связей значение таки имеет

Количество вершин и ребер — связанные величины, причем одного порядка в реальных случаях. Как хочешь, так и считай.
Re[31]: Почему Delphi всё еще жив?!
От: Eugeny__ Украина  
Дата: 27.10.10 09:22
Оценка: :)
Здравствуйте, enji, Вы писали:

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


G>>>>Количество связей значение не имеет.


E>>>Ты серьезно? Придется по разу пройтись по каждому ребру графа. Другое дело, если на конце ребра видим помеченную вершину, то останавливаемся

G>>Ну и сколько ребер будет в графе? Очевидно что не N^2 потому что все со всеми живые объекты связаны не будут, то есть примерно количество ребер в графе будет линейно зависеть от количества вершин. В итоге тот же O(N) получим

E>Ну т.е. кол-во связей значение таки имеет


E>На самом деле может быть даже больше N^2


Если в коде такое количество связей, и объекты друг на друга ссылаются, то проблема со скоростью GC уходит даже не на второй план, а сильно дальше, потому как самая главная проблема в днк писавшего такой код.
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Re[45]: ЧОЧО?
От: hattab  
Дата: 27.10.10 10:37
Оценка:
Здравствуйте, gandjustas, Вы писали:

g> g>> H>Повторить полный аналог можно и в дельфях, с той лишь разницей, что код она не сгенерирует В этом чтоли вся прелесть?


g> g>> Ну покажи полный аналог для такого
Автор: gandjustas
Дата: 26.10.10
например.


g> H>Т.е. ты мне на полном серьезе предлагаешь тут реализовать собственный Rx? Шутник, однако.


g> Нет, конкретный пример повтори с итератором, можно без асинхронности.


Если я правильно понял, это чтение из потока.
...
   TEnumerator = Record

    Strict Private

     FStream : TStream;
     FBuffer : TBytes;

    Public

     Procedure Init(AStream : TStream; ABufferSize : Integer);

     Function MoveNext : Boolean;
     Function GetCurrent : TBytes;

   End;
...

Procedure TEnumerator.Init(AStream : TStream; ABufferSize : Integer);
Begin

 FStream := AStream;
 SetLength(FBuffer, ABufferSize);

End;

Function TEnumerator.MoveNext : Boolean;
Var

 Count : Integer;

Begin

 Count := FStream.Read(Pointer(FBuffer)^, Length(FBuffer));

 If Count <> Length(FBuffer) Then
  SetLength(FBuffer, Count);

 Result := Count > 0;

End;

Function TEnumerator.GetCurrent : TBytes;
Begin

 Result := FBuffer;

End;
avalon 1.0rc3 rev 363, zlib 1.2.3
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.