Re[2]: Зверёк читает мануал: properties
От: WinterMute Россия http://yarrr.ru
Дата: 03.05.05 16:45
Оценка:
CS>Дополнение:

CS>В D typedef вводит новый тип, а не алиас как в C++.


CS>т.е.


CS>
CS>typedef uint Color; 
CS>Color c; 
CS>c += 28; // ошибка компиляции.
CS>


Не очень понятно, какой от этого выйгрыш?

Вот чтобы хотелось увидеть от нового языка, это какой-нибудь хитрый способ наследования от базовых типов, чтобы можно было писать:

class IdealInt : public int
{
 //...
};
ЧАСТЬ 3: Конструкторы, деструкторы, и RAII
От: Зверёк Харьковский  
Дата: 03.05.05 16:53
Оценка:
Конструкторы-деструкторы

Конструкторы в D, в общем, имеют что-то общее с С++, но с некоторыми исключениями:
class Constructors: Base
{
    int a;

    this();            //конструктор всегда зовут this. Что облегчает использование паттерна проектирования copy-paste :)
    this(int i)     //как и в C++, конструкторов может быть несколько, они могут принимать параметры
    {
        a = i;        //инициализация членов - просто в теле конструктора
        this();        //в отличие от С++, конструкторы могут вызывать друг друга.
        
        super(10);    //вызов конструкторов базового класса - в любом месте конструктора. если нет явного вызова, вызовется в самом начале this(
    }
    
    int b = 18;        //инициализация членов константами
    
    ~this()            //с деструктором тоже все банально - он один, без параметров, всегда виртуальный
    {
    }
};


Статические конструкторы-деструкторы

Сюрприз! D позволяет каждому классу выполнять сколь угодно сложную инициализацию до начала функции main:
class A
{
    int r = random();       //так нельзя!
    
    static this()
    {
        //это выполнится до начала main 1 раз. выделение ресурсов, задание начальных значений данных членов...
        r = random();       //а вот так - можно!
    }
    
    static ~this()
    {
        //выполнится после конца main
    }
}

Теоретически, пара статический конструктор/статический деструктор, возможно, подойдет для создания синглетонов...

RAII

RAII — фича, за отсутсвие которой обычно пеняют языкам с GC (а D — именно такой язык).

В С++ реализация RAII — лишь одно из следствий правил областей видимости и времени жизни переменной:
class Resource
{
    Resource()
    {
    /*
        открываем файлы, создаем сокеты и вообще творим всякие непотребства
    */
    }
    
    ~Resource()
    {
    //убираем за собой
    }
}

//где-то в коде:
{
    Resource r;    //взяли ресурс
    
    ....
} //ресурс освободился - даже в случае исключения


Поскольку в D все переменные пользовательских типов создаются выражением new и удаляются сборщиком мусора как-нибудь при случае, то такой фокус не пройдет. Поэтому в D можно явно сделать класс RAII классом:
auto class Resource        //весь фокус - тут
{
    this()
    {
    /*
        открываем файлы, создаем сокеты и вообще творим всякие непотребства
    */
    }
    
    ~this()
    {
    //убираем за собой
    }
}

//где-то в коде:
{
    Resource r = new Resource;       //так авто-классы использовать нельзя
    auto Resource r =  new Resource; //только с явным указанием намерений
    
    ....
} //при выходе из scope - вызовутся деструкторы всех auto-переменных, ресурсы освободятся - даже в случае исключения
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
FAQ — це мiй ай-кью!
Пробую....
От: Зверёк Харьковский  
Дата: 03.05.05 16:57
Оценка:
Здравствуйте, IT, Вы писали:

ЗХ>>А можно? Хочу Буду Влада пугать


IT>А ну ка попробуй чего-нибудь написать


сабж.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
FAQ — це мiй ай-кью!
Re[8]: Снова D: Зверёк читает мануал
От: Зверёк Харьковский  
Дата: 03.05.05 17:00
Оценка:
Здравствуйте, uw, Вы писали:

ЗХ>>Да я вот все думаю, с какой бы стороны подступиться к интеграции его с С++ными библиотеками... ИМХО, решение должно быть где-то рядом

uw>SWIG

uw>Вроде кто-то реализовывал поддержку D. Самые новые исходники там, в svn репозитории. В каком это состоянии, я не в курсе, но возможно во вполне работоспособном. Вот страница с более старыми версиями(включая бинарники) и хоть каким-то описанием.


Вав! Про свиг знал, про то что он есть под D — даже предположить не мог. Получи заслуженную оценочку
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
FAQ — це мiй ай-кью!
Re[6]: Снова D: Зверёк читает мануал
От: Зверёк Харьковский  
Дата: 03.05.05 17:00
Оценка:
Здравствуйте, IT, Вы писали:

ЗХ>>А можно? Хочу Буду Влада пугать


IT>А ну ка попробуй чего-нибудь написать


ой, какая прелесть А можно это так и оставить?

ЗЫ: жаль, в Янусе все равно не видно
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
FAQ — це мiй ай-кью!
Re[7]: Снова D: Зверёк читает мануал
От: IT Россия linq2db.com
Дата: 03.05.05 18:02
Оценка: :))) :)
Здравствуйте, Зверёк Харьковский, Вы писали:

IT>>А ну ка попробуй чего-нибудь написать


ЗХ>ой, какая прелесть А можно это так и оставить?


Ну если никто не будет возражать и оценочку мне уберёшь

ЗХ>ЗЫ: жаль, в Янусе все равно не видно


Это к АВК. Мне пришлось для этого исходники сайта менять, ему видимо придётся новую версию януса выпускать
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[7]: Снова D: Зверёк читает мануал
От: Слава Шевцов Россия http://www.rentaguru.ru/
Дата: 03.05.05 18:04
Оценка: +1 :)))
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>>>А можно? Хочу Буду Влада пугать

IT>>А ну ка попробуй чего-нибудь написать

ЗХ>ой, какая прелесть А можно это так и оставить?


Я тоже за, о великий и ужасный Зверёк.

ЗХ>ЗЫ: жаль, в Янусе все равно не видно


"Сказку о старике и рыбке" помнишь? Что там со старухой случилось?
----------------------------------------------------------------------------------------------
Rentaguru
Re[8]: Снова D: Зверёк читает мануал
От: LCR Россия lj://_lcr_
Дата: 03.05.05 18:07
Оценка:
IT,

Невооружённым глазом видно, что пермишнов редактировать сообщения у тебя хватает Не сочти пожалуйста за труд, обрати внимание на сообщение http://www.rsdn.ru/Forum/Message.aspx?mid=1154800&amp;only=1
Автор: LCR
Дата: 03.05.05
.

Спасибо.
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re: Дополнение/исправление
От: c-smile Канада http://terrainformatica.com
Дата: 03.05.05 19:17
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>Сюрприз! D позволяет каждому классу выполнять сколь угодно сложную инициализацию до начала функции main:

ЗХ>
ЗХ>class A
ЗХ>{
ЗХ>    int r = random();       //так нельзя!
    
ЗХ>    static this()
ЗХ>    {
ЗХ>        //это выполнится до начала main 1 раз. выделение ресурсов, задание начальных значений данных членов...
ЗХ>        r = random();       //а вот так - можно!
ЗХ>    }
    
ЗХ>    static ~this()
ЗХ>    {
ЗХ>        //выполнится после конца main
ЗХ>    }
ЗХ>}
ЗХ>

ЗХ>Теоретически, пара статический конструктор/статический деструктор, возможно, подойдет для создания синглетонов...

"возможно, подойдет для создания синглетонов..." собственно это они и есть.

Второе.
"инициализацию до начала функции main" это немного не так.

Вот исходник Harmonia WinMain, я выделил то место где инициализируются/"терминируются"
статические конструкторы/деструкторы


extern (C) void gc_init();
extern (C) void gc_term();
extern (C) void _minit();
extern (C) void _moduleCtor();
extern (C) void _moduleUnitTests();

extern (Windows)
int WinMain(HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow)
{
    int result = 0;

    gc_init();          // initialize garbage collector
    _minit();           // initialize module constructor table

    try
    {
      _moduleCtor();      // call module constructors
      _moduleUnitTests(); // run unit tests (optional)
    }
    catch (Object o)        // catch any uncaught exceptions
    {
      // failed [code skiped]....  
      result = -2;
    }

    if( result == 0 )
    {
      try 
      {
        NativeApplication.initialize();
        // main message pump loop
        while( true ) 
        {
          if(!NativeApplication.doEvents())
            break;
        }
        result = 0; 
      }
      
      catch (Object o)        // catch any uncaught exceptions
      {
        result = -1;     // failed
        // [code skiped]
      } 
      finally 
      {
        NativeApplication.finalize();
      }
    }

    gc_term();          // run finalizers; terminate garbage collector
    return result;
}
Re[2]: Дополнение/исправление
От: LCR Россия lj://_lcr_
Дата: 03.05.05 19:30
Оценка:
c-smile:

Вот ещё два момента, из-за которых я плохо сплю:
Ы?
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[3]: Дополнение/исправление
От: c-smile Канада http://terrainformatica.com
Дата: 03.05.05 20:16
Оценка:
Здравствуйте, LCR, Вы писали:

LCR>c-smile:


LCR>Вот ещё два момента, из-за которых я плохо сплю:

LCR>
  • Есть 2 точки деструкции объекта: когда его можно удалить (например, на объект есть единственная ссылка, и она выходит из зоны видимости), и когда объект действительно удаляется. Желательно иметь возможность написать свой код для обоих случаев. (auto — это да, а ещё?)

    "на объект есть единственная ссылка" это определить в принципе возможно
    но вычислительно относительно дорого (нужно прогнать gc_mark).
    Что можно сделать так это в деструкторе узнать "мы внутри GC или нет".

    LCR>
  • Можно ли вызывать виртуальные функции в конструкторах и деструкторах?
    LCR>Ы?

    Да.
  • Re[4]: Снова D: Зверёк читает мануал
    От: Шахтер Интернет  
    Дата: 03.05.05 23:12
    Оценка:
    Здравствуйте, uw, Вы писали:

    uw>Здравствуйте, Зверёк Харьковский, Вы писали:


    ЗХ>>Два последних оператора — не очень-то рулез по производительности. Зато по очевидности — это, имхо намного лучше, чем "многозначный" оператор из D

    uw>Этот "многозначный" оператор придуман в первую очередь для случаев, когда сравниваемые значения(или их часть) можно привести к целочисленному типу. Такая модель сравнения давным-давно используется скажем в libc(strcmp, qsort, итд), Java(интерфейс Comparable), .NET(IComparable).

    uw>Что может быть проще и очевидней вот такого кода?


    uw>
    uw>class Task
    uw>{
    uw>    private int priority;
    uw>    public int opCmp(Task t)
    uw>    {
    uw>        return priority - t.priority;
    uw>    }
    uw>}
    uw>


    Код некорректный.
    ... << RSDN@Home 1.1.3 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[3]: Арифметические операции
    От: Шахтер Интернет  
    Дата: 03.05.05 23:12
    Оценка:
    Здравствуйте, uw, Вы писали:

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


    MS>>Повторю еще раз — в рамках арифметической записи задача нерешаема в любом языке.

    MS>>Другая часто возникающая потребность — получение частного и остатка. Во всех извесных мне архитектурах это делается одной командой DIV. Но вот мы пишем:
    MS>>
    MS>>int lift = a/b;
    MS>>int rem  = a%b;
    MS>>

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

    uw>На самом деле работы в этом направлении(гарантированная оптимизация) ведутся, пока только исследовательские. И для этого не нужна будет специальная конструкция языка. Кстати два возвращаемых значения для функциональных языков(коими ни D,ни C++ естественно не являются) не проблема.


    Да и в С++ это не проблема.
    ... << RSDN@Home 1.1.3 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[2]: Арифметические операции
    От: Шахтер Интернет  
    Дата: 03.05.05 23:12
    Оценка:
    Здравствуйте, McSeem2, Вы писали:

    MS>В высокоуровневых языках часто возникает ситуация "за лесом деревьев не видать".

    MS>Взять, хртя бы простейшее выражение (операция целочисленного масштабирования):
    MS>
    MS>int v = a*b/c;
    MS>

    MS>a, b, c — все int. Так вот, на всех известных мне современных архитектурах, операция MUL выдает результат вдвое большей разрядности. А операция DIV тоже требует двойной разрядности. Таким образом, при использовании ассемблера, можно масштабировать целые значения практически во всем их диапазоне, не переходя на двойную разрядность целиком.

    MS>Но копилятор обязан обрезать промежуточный результат a*b снова до одинарной разрядности и нет способа объяснить, что вот в данном случае обрезать не надо. Почему "обязан" — во-первых, компилятор не знает — может быть переполнение играет важную роль в данном алгоритме. Во-вторых, если мы усложним выражение: a*b*c/d — нам уже понадобится не двойная а тройная разрядность. Таким образом, в языках высокого уровня нет способа задействовать простую и эффективную последовательность инструкций mul/div. Таким образом, хотелось бы иметь что-то типа:


    MS>
    MS>v = a.muldiv(b, c);
    MS>или 
    MS>v = a.mulshift(b, 32); // - умножаем и берем старшие 32 бита
    MS>


    MS>Повторю еще раз — в рамках арифметической записи задача нерешаема в любом языке.


    MS>Другая часто возникающая потребность — получение частного и остатка. Во всех извесных мне архитектурах это делается одной командой DIV. Но вот мы пишем:

    MS>
    MS>int lift = a/b;
    MS>int rem  = a%b;
    MS>

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

    struct MulResult
     {
      int hi;
      unsigned int low;
      
      operator int() const { return low; }
     };
     
    builtin MulResult operator * (int a,int b);


    На самом деле, реализовать подобные вещи не сложно. Просто никто из разработчиков компиляторов/языков этим не озабочен. Злы.
    ... << RSDN@Home 1.1.3 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[5]: Снова D: Зверёк читает мануал
    От: c-smile Канада http://terrainformatica.com
    Дата: 04.05.05 00:27
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    uw>>
    uw>>class Task
    uw>>{
    uw>>    private int priority;
    uw>>    public int opCmp(Task t)
    uw>>    {
    uw>>        return priority - t.priority;
    uw>>    }
    uw>>}
    uw>>


    Ш>Код некорректный.


    Суров ты брат Шахтер и не многословен.
    Объясни что в этих двух соснах не так?
    Re[6]: Снова D: Зверёк читает мануал
    От: Sinclair Россия https://github.com/evilguest/
    Дата: 04.05.05 01:06
    Оценка: 16 (1) +2
    Здравствуйте, c-smile, Вы писали:

    CS>Объясни что в этих двух соснах не так?

    наверное, possible integer overflow.
    ... << RSDN@Home 1.1.4 beta 5 rev. 395>>
    Уйдемте отсюда, Румата! У вас слишком богатые погреба.
    Re[6]: Снова D: Зверёк читает мануал
    От: Шахтер Интернет  
    Дата: 04.05.05 02:35
    Оценка: 16 (1) +2
    Здравствуйте, c-smile, Вы писали:

    CS>Здравствуйте, Шахтер, Вы писали:


    uw>>>
    uw>>>class Task
    uw>>>{
    uw>>>    private int priority;
    uw>>>    public int opCmp(Task t)
    uw>>>    {
    uw>>>        return priority - t.priority;
    uw>>>    }
    uw>>>}
    uw>>>


    Ш>>Код некорректный.


    CS>Суров ты брат Шахтер и не многословен.

    CS>Объясни что в этих двух соснах не так?

    max_int > (-1) , max_int — (-1) == min_int < 0 .
    ... << RSDN@Home 1.1.3 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Re[8]: Снова D: Зверёк читает мануал
    От: ansi  
    Дата: 04.05.05 02:54
    Оценка:
    Здравствуйте, IT, Вы писали:

    IT>Ну если никто не будет возражать и оценочку мне уберёшь

    Вымогательство!
    Re[7]: Снова D: Зверёк читает мануал
    От: c-smile Канада http://terrainformatica.com
    Дата: 04.05.05 03:06
    Оценка:
    Здравствуйте, Шахтер, Вы писали:

    CS>>Здравствуйте, Шахтер, Вы писали:


    uw>>>>
    uw>>>>class Task
    uw>>>>{
    uw>>>>    private int priority;
    uw>>>>    public int opCmp(Task t)
    uw>>>>    {
    uw>>>>        return priority - t.priority;
    uw>>>>    }
    uw>>>>}
    uw>>>>


    Ш>>>Код некорректный.


    CS>>Суров ты брат Шахтер и не многословен.

    CS>>Объясни что в этих двух соснах не так?

    Ш>max_int > (-1) , max_int — (-1) == min_int < 0 .


    Ах это! Ну дык там диапазон возможных
    значений всего от -15 до 15 (Win32 thread priority levels)

    А так, да, согласен — для краевых значений int это не работает.
    Re[8]: Снова D: Зверёк читает мануал
    От: Шахтер Интернет  
    Дата: 04.05.05 03:29
    Оценка:
    Здравствуйте, c-smile, Вы писали:

    CS>Здравствуйте, Шахтер, Вы писали:


    CS>>>Здравствуйте, Шахтер, Вы писали:


    uw>>>>>
    uw>>>>>class Task
    uw>>>>>{
    uw>>>>>    private int priority;
    uw>>>>>    public int opCmp(Task t)
    uw>>>>>    {
    uw>>>>>        return priority - t.priority;
    uw>>>>>    }
    uw>>>>>}
    uw>>>>>


    Ш>>>>Код некорректный.


    CS>>>Суров ты брат Шахтер и не многословен.

    CS>>>Объясни что в этих двух соснах не так?

    Ш>>max_int > (-1) , max_int — (-1) == min_int < 0 .


    CS>Ах это! Ну дык там диапазон возможных

    CS>значений всего от -15 до 15 (Win32 thread priority levels)

    CS>А так, да, согласен — для краевых значений int это не работает.


    Если диапазон значений маленький, то да, но лучше на это не полагаться.
    ... << RSDN@Home 1.1.3 stable >>
    В XXI век с CCore.
    Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.