четверг, 2 апреля 2009 г.

Из непонятого: alias this в языке D 2.0

В преддверии 1-го апреля Вальтер Брайт выпустил новые версии своего компилятора языка программирования D. Списки изменений для версий 1.0 и 2.0 можно посмотреть здесь:

http://www.digitalmars.com/d/1.0/changelog.html
http://www.digitalmars.com/d/2.0/changelog.html

В язык D 2.0 была добавлена фича, которую я раньше нигде не видел: alias this. Как я смог понять из документации, эта конструкция позволяет переадресовать все вызовы, которые компилятор не смог связать с самим объектом, на указанный атрибут этого объекта. Вот пример из документации:

struct S
{   int x;
    alias x this;
}

int foo(int i) { return i * 2; }

void test()
{
    S s;
    s.x = 7;
    int i = -s;   // i == -7
    i = s + 8;    // i == 15
    i = s + s;    // i == 14
    i = 9 + s;    // i == 16
    i = foo(s);   // implicit conversion to int
}

Здесь получается, что большинство операций над экземпляром s на самом деле переадресуется его атрибуту x. Т.е. такая конструкция позволяет легко выдать экземпляр/объект структуры/класса за экземпляр другого типа. Всего лишь с помощью alias this. В C++ для этого пришлось бы определять кучу операторов. А в D – только alias this :)

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

Но вот есть у меня серьезное подозрение, что понимаемость D-шных программ, в которых данный трюк используется, основательно снизится. И это все в языке, который декларировался как более простой и логичный C++. И если C++ ругают за то, что в результате своего развития он превратился в клоаку очень разрозненных идей и концепций, то у D есть все шансы переплюнуть C++ в этом отношении.

понедельник, 30 марта 2009 г.

Воскресное, разное…

Спортивное…

Закончился кубок мира у биатлонистов. Жалко. Очень интересно смотреть, очень непредсказуемый вид спорта. Немного жаль Томаша Сикору – ветеран по ходу сезона лидировал в Кубке Мира. Но Бьердален, конечно, велик. Казалось бы, и сезон начал не шатко, ни валко. И конкуренты сильные, тот же Сведсен из той же сборной Норвегии. Но, как же человек подвел себя к Чемпионату Мира! Великий спортсмен.

У женщин, в отличии от мужчин, до самой последней гонки ситуация в общем зачете была интригующей. Промежуточный лидер общего зачета, Хелена Юнссон, была в незавидной ситуации. После вычета худших гонок у нее оказывалось меньше очков, чем у Кати Вильхельм. Поэтому Юнссон обязательно должна была выигрывать у Кати Вильхельм, причем обязательно несколько мест. До самого последнего огневого рубежа Юнссон шла сразу вслед за Вильхельм. Наверное, специально, чтобы создавать немке напряжение. И на последнем рубеже Вильхельм ошиблась, а Юнссон была точна.

На финише Юнссон была второй, а Вильхельм – шестой. И в итоге оказалось, что по результатам сезона у Юнссон и Вильхельм одинаковое количество очков. Но Юнссон все же выиграла Большой Хрустальный Глобус, т.к. у нее больше побед.

Вот так вот. Вильхельм, как и Сикора, лидировала по ходу сезона. Но несколько неудачных выступлений на последних этапах – и Кубок Мира уплыл… Но Вильхельм, в отличии от Сикоры, очень и очень здорово выступила на Чемпионате Мира (два золота – это не хухры-мухры).

Забавно, что Малый Хрустальный Глобус в индивидуальных гонках, где очень важна точная стрельба (каждый промах – это целая штрафная минута), получила Магдалена Нойнер. Молодая, но уже титулованная спортсменка, отличающаяся очень-очень быстрым ходом и очень-очень нестабильной стрельбой. Такие вот казусы.

Иногда кажется, что развитие и сопровождение долгоживущего программного проекта (особенно Open Source проекта) очень напоминает длительные спортивные соревнования, вроде Кубка Мира у биатлонистов. Точно так же нельзя сдаваться, нужно верить в победу и идти к ней. Даже временами сцепив зубы.

Еще начался сезон автомобильных гонок Формулы-1. Что-то странное со мной произошло – первая гонка не торкнула. Вообще. Даже не смотря на то, что была интересной, с обилием обгонов, аварий и непредсказуемым финалом (чего стоит хотя бы сход шедших на втором и третьем местах гонщиков за два круга до финиша). Но не торкнуло. Вероятно, этап боления за Формулу-1 в моей жизни подошел к концу. А начиналось все году в 1993-м, когда ее только транслировать по РТР начали. Практически с первых гонок я болел за Михаэля Шумахера… Удачно выбрал, за кого болеть, нужно сказать :) После ухода Шумахера болел за Кими Райконена. Сейчас ни за кого не болею. Наверное, поэтому и Формула уже не интересна – ну гоняются и гоняются. Нет того напряжения, которое возникает, когда ты до последней минуты ждешь какого-то чуда. Которое, надо сказать, случается. До сих пор помню гонку, в которой Шумахер был безнадежно вторым, а Мика Хаккинен шел к своей победе. И вот, метров за 800(!) до финиша Хаккинен глохнет, а Шумахер выигрывает! Вот это было да! Впрочем, тогда и трава была зеленее, и вода мокрее… :)

Велосипедостроитель, блин! :)

Где-то неделю назад я уже сказал свое “Фи” изобретателям современных сливных бачков. Понапридумывают, блин, хитрых впускных клапанов. Потом фиг знает, как их исправить, когда они протекать начинают.

Пакость еще и в том, что нас угораздило купить такой унитаз-компакт, у которого шлаг должен подключаться к бачку снизу. Я обошел все окрестные хозяйственные магазины в поисках предназначенного для подобной конструкции входного клапана. Напрасно. А ехать через полгорода на строительный рынок было в лом. Тем более, что наверняка бы пришлось покупать всю начинку для бачка, а мне нужен был только входной клапан.

В результате решил повелосипедостроить сам. Чай не хуже этих неизвестных мне горе-конструкторов :)

Итак, берется обычный входной клапан для боковой конструкции:

У него очень простой принцип – по мере заполнения бачка водой поплавок начинает поднимать рычаг и входное отверстие перекрывается. Но этот клапан должен устанавливаться горизонтально. По замыслу конструкторов. А вот по моему:

его можно устанавливать уже вертикально. Наверное, можно было еще проще сделать, но и так заработало.

Вообще, изготовители такого клапана тоже редиски. Мало того, что рычаг с корпусом они соединили при помощи обычного гвоздя. Так еще и пластмассы для резьбы пожалели – нет чтобы миллиметров на 5-10 длиннее резьбу сделать. Экономисты, блин! Так что увижу подобный клапан с более длинной резьбой – куплю и переделаю.

Пока возюкался с этим клапаном и сливным бачком, наговорил матов больше, чем за всю предшествующую неделю. Видимо, некоторые занятия заставляют менять свой словарь :)

Рабочее, творческое…

Накануне выходных удалось-таки синтезировать и оформить идею о том, как в SObjectizer обойтись без внешних DSL, но при этом получить довольно прозрачный C++ код и хороший контроль за корректностью описаний агентов.

А в воскресение получилось-таки записать идею о возможном способе контроля за перегрузками агентов и о новом взгляде на приоритеты событий.

Похоже, что очертания SObjectizer-5 становятся все более и более отчетливыми. Таки становятся :)


Чу! Пока писал, уже понедельник начался :)