спаммер valen_1984
гляньте на его сообщения
гляньте на его сообщения
Вот пример (наивной) попытки:
template<class T1, class T2> class MatchableFor
{
public:
MatchableFor(): what(0)
{
if(настоящий класс это не T1 и не T2, узнается с помощью (2) )
throw SomeError;
else if( настоящий класс это T1 )
what=1;
else if( настоящий класс это T2 )
what=2;
}
virtual void run(Runnable< MatchableFor<T1,T2> > r1, Runnable< MatchableFor<T1,T2> > r2)
{
what==0 ? throw SomeError :
what==1 ? r1.run(dynamic_cast<T1*>this) :
what==2 ? r2.run(dynamic_cast<T2*>this) :
throw SomeError;
}
private:
int what;
};
class Child1;
class Child2;
struct Parent: public MatchableFor<Child1, Child2>
{
virtual void do_something()=0;
};
class Child1: public Parent { void do_something() { f(); } }; // ok
class Child2: public Parent { void do_something() { g(); } }; // ok
class Child3: public Parent { void do_something() { h(); } }; // а вот это можно недопустить с помощью (1)
вроде бы (2) вообще невозможно, а (1) и (3) мне неизвестно
http://fprog.ru/2009/issue3/dmitry-astapov-alexey-shchepin-building-google-wa...
Хочется то же, но на Хаскель.
1. Хаскель или примочка к нему позволяют иметь доступ хотя бы на чтение к AST?
2. Альтернативно мы можем определить какой-то параметризованный тип данных, который бы например сумму своих двух значений не вычислял, а отдавал бы выражение (надеюсь, идея понятна):
a + b = AST_Node_Plus a b
вопрос в том, обломится ли такой подход — ведь перегружать надо ВСЕ, в том числе так сказать «функцию паттерн матчинга» и «функцию определения функций».
Speed Dial по умолчанию идет с загрузкой изображений, как настроить на ней по умолчанию cached images — не нашел.
Какой-то странный ад-блокер у нее — на лоре категорически не хочет блочить фрейм с айбиэмевской рекламой и счетчик mail.ru. Как?
И вообще киньте ссылочкой по прикручиванию к ней чего-нить своими руками — особенно блокировать рекламу.
Это так и задумано, или баг?
Дискуссия началась при обсуждении Хаскеля 2010
Мой тезис состоит в том, что в Хаскеле поддержка зависимых типов хуже, чем в с++. (А как дело обстоит с Template Haskell?)
И пока что Miguel не представил определение зависимых типов (или ссылку на нее), по которому можно однозначно рассудить, есть ли в с++ зависимые типы. Боюсь, что пока я не реализую ему на шаблонах всю agda, он не согласится на наличие зависимых типов в с++ :-)
В процессе обсуждение родилось задание, похожее вот на это:
создаем вектор a с размерностью вводимой юзером
создаем вектор b с размерностью вводимой юзером
попытка перемножить несовместимые вектора a*b не компилируется
создаем вектор с с размерностью, равной размерности вектора а
попытка перемножить совместимые вектора a*с компилируется
выводим результат — скалярное произведение
Вот как я это сделал:
/*
$ g++ -DTRY dependent-type5.cxx
dependent-type5.cxx: In function ‘int main()’:
dependent-type5.cxx:68: error: no match for ‘operator*’ in ‘a * b’
dependent-type5.cxx:35: note: candidates are: double Vector<dimension>::operator*(const Vector<dimension>&) [with unsigned int* dimension = (& x)]
$ g++ dependent-type5.cxx
$ ./a.out
please enter dimension for vector a: 2
please enter element #0 for vector a: 1
please enter element #1 for vector a: 2
please enter dimension for vector b: 1
please enter element #0 for vector b: 1
please enter element #0 for vector c: 1
please enter element #1 for vector c: 2
a*c = 5
please enter element #0 for vector d: 1
please enter element #1 for vector d: 2
f(a)= 5
*/
#include <iostream>
#include <vector>
template<unsigned int* dimension> class Vector
{
public:
Vector(const char* msg): v( *dimension = *dimension ? *dimension : get_dimension(msg) ), dim(dimension)
{
for(int i=0; i<*dimension; i++) {
std::cout << "please enter element #" << i << " for vector " << msg << ": ";
std::cin >> v[i];
}
}
double operator* (const Vector<dimension>& that) /// вот тут мы следим за размерностью! зависимые типы, да.
{
double result=0;
for(int i=0; i<*dimension; i++)
result += v[i] * that.v[i];
return result;
}
private:
std::vector<double> v;
const unsigned int* const dim; /// для полноты картины
static unsigned int get_dimension(const char* msg)
{
unsigned int result;
std::cout << "please enter dimension for vector " << msg << ": ";
std::cin >> result;
return result;
}
};
template<unsigned int* dimension> double f(Vector<dimension> a)
{
Vector<dimension> d("d");
return a*d;
}
unsigned int x=0, y=0;
int main()
{
Vector<&x> a("a"); /// создаем вектор a с размерностью вводимой юзером
Vector<&y> b("b"); /// создаем вектор b с размерностью вводимой юзером
#ifdef TRY
double z0 = a*b; /// попытка перемножить несовместимые вектора a*b не компилируется
#endif
Vector<&x> c("c"); /// создаем вектор с с размерностью, равной размерности вектора а
/// (это можно записать по-другому: typeof(a) c("c"); но вероятно это не нужно)
/// (однако если все же нужно, потребуется с++0х)
double z1 = a*c; /// попытка перемножить совместимые вектора a*с компилируется
std::cout << "a*c = " << z1 << "\n"; /// выводим результат -- скалярное произведение
double z2 = f(a); /// теперь считаем то же самое, но как вызов функции f -- компилируется
/// (важно то, что размерность в явном виде в функцию f не передается)
std::cout << "f(a)= " << z2 << "\n"; /// снова выводим результат -- скалярное произведение
return 0;
}
Комментарий: если размерность, поданная вектору, нулевая, он ее читает от юзера, а если ненулевая — то использует.
(Кто знает Qi? интересно было бы взглянуть на решение на нем)
Решение на Template Haskell с UnsafeIO наверно подойдет, но интересно было бы попугать народ полноценным решением без UnsafeIO :-)
И еще меня интересуе, как переписать на (Template?) Haskell вот это (даже если тут нет зависимых типов):
const int n=17;
...
Z<n> f(int x) { return mod<n>(x+(n/2)); }
Понятно, что надо страться void* избегать, как и слова на букву «а», которое не понравилось Шаману007,
однако ЛОР — одно из мест,
где интересы краткости и точности выражения своей мысли перевешивают интересы эмоциональной приятности сообщения.
В некоторых случаях это слово необходимо, хотя лично мне за 4000+ сообщений оно не понадобилось до момента, когда надо было ответить Шаману007.
Тотальное вырезание этого слова не приведет к улучшению качества постов тех людей, которых интересуют эмоции, а не точность,
т.к. таких исправить вообще невозможно,
и помешает той категории людей, которую интересует точность, выражаться точно.
____________________________________________
Популярность этого слова на ЛОРе обусловлена в том числе и объективными причиной — программирование, возможно, так еще не стало индустрией,
т.к. повторное или иное нестандартное использование честно купленного или свободного кода программистом, пользователем, или интегратором
либо соврешенно бессмысленно запрещено лицензией
либо требует действий, аналогичных удалению гланд через отверстие с противоположной стороны человеческого тела :-)
Эта программа создана под руководством Martin C. Rinard, профессора MIT. ClearView не нуждается в исходном коде программы. Работа ClearView состоит из следующих стадий:
Таким образом программа может продолжать работать до внесения исправления в исходники.
Если бы вы изобретали С++ с чистого листа, то как бы вы...?
___
Чтобы тема была чуть определеннее, приведу несколько обычных притензий к С++, и мои предложения как это исправить:
1. Вроде-как-объявление переменной Something s=1; может вызвать сколь угодно длинное вычисление
Решение: разный синтаксис:
Something s=1; означает, что конструктор s завершается за заранее известное число таков (и деструктора нет?)
Something s(1); означает... что ожидать можно что угодно.
2. С++ поддерживает перегрузку оператора [] -- и это значит, что a["asdf"] может обращаться за значением к серверу на другой стороне Земли, не говоря уж о произвольном таймауте и возможном выбросе исключения. В то же время абстрактная запись типа a["asdf"] для языка высокого уровня *НУЖНА*. Поэтомо, возможно, следует *на уровне синтаксиса* различать абстрактное и гарантированно-себя-хорошо-ведущее.
Решение: разный синтаксис:
a.[i] означает, что компилятор гарантирует, что i не выйдет за пределы границ массива а, операция завершается за заранее известное число таков, и проверка в ран-тайме *не нужна*, как например в случае for(int i=0; i<sizeof(a)/sizeof(a.[0]); i++) do_something(a.[i]);
a.at(i) (или a.at[i]?) означает, что проверка диапазона (или наличия значения в хэше, или ... ) производится, операция завершается за заранее известное число тактов; выход за границы -- это критическая ошибка логики программы, и при ее наличии программа должна gracefully завершиться.
a[i] означает... что ожидать можно что угодно.
3. Исключительно тормозные плюсовые исключения (на десятичные порядки) http://www.linux.org.ru/view-message.jsp?msgid=3856841
Решение: ввести быстрые "статические" исключения, эквивалентные сишной проверке возвращенного значения (при этом компиятор должен проверять то, что все варианты кода возврата проверены, либо проверен просто факт неудачи). Но это отдельный разговор.
(Понятно, что все это требует более умного компилятора)
Ну и в таком же духе -- т.е. хотелось бы услышать либо притензии такого типа, либо мнения/уточнения по рассказанным притензиям.
5 лет назад, 20 октября 2004 года, вышел первый релиз Убунту.
Обычная фраза: deriving (Read, Show, Eq, Ord)
Компилятор умеет выводить инстансы этих typeclass-ов. А что делать, если хочется их выводить чуть-чуть по-другому или добавить еще один, который автоматически бы выводился? (Для этого, возможно, подошло что-то похожее на reflection, патчить компилятор не предлагайте)
__________________________________________________
Недемократизм языка в моем понимании -- это
1. Частичная реализация некой фичи и одновременно отстутствие инструмента для расширения реализации этой фичи. Например в яве оператор + для сложения целых, вещественных, строк и все: комплексные, кватернионы, вектора, матрицы... складывай уже через add.
2. Невозможность смены конкретной реализации фичи (зачастую связано с п.1). Например, невозможность создать в рамках с++ свой virtual dispatch (для того, что сделать множественный virtual dispatch, т.е. п.1). В принципе, п.2 до некоторой степени неизбежен, так как иногда намного проще сделать фичу, чем API для написания фич).
__________________________________________________
Более глобальный вопрос -- а насколько хаскель демократичен? (для обеспечения демократизма разрешается использовать ключи компилятора, template haskell, ...)
Предлагаю исправить -- вставить линк на http://www.linux.org.ru/view-message.jsp?msgid=3959726 , а может еще лучше -- сделать статический адрес, который бы переадресовывался в текущую жалобную книгу.
Речь идет о http://www.linux.org.ru/view-message.jsp?msgid=3998050
> ... диспетчер совершенно нового уровня, интегрированный во все элементы системы для максимально чёткой работы ... который теперь будет шагать в ногу со временем вместе с такими же ...
Маркетоидный понос.
> ... OpenCL позволяет разработчикам программ ощутить всю полноту графической фантазии ...
С каких пор OpenCL отосится к графике??? это не OpenGL, это язык для юзания GPU, не более того.
Подчеркну, что я __за__ новости об Apple, и даже как-то сам постил новость о том, что Mac-у исполнилось 25 лет.
_________________________________________________
Отдельно Макскому:
твой аргумет "Хочешь сделать лучше - ссылка на форму добавления новости на главной странице внизу" -- не проходит, т.к. мою новость про "25 лет мак-у" модераторы не пропустили.
http://www.linux.org.ru/view-message.jsp?msgid=3973125
Как минимум, представь, что ЛОР бы отдавался прямыми запросами к БД и отрисовывался клиентским кодом типа Google Native Client в браузере -- это было бы и прямее, и удобнее.
Вообще я девелопменте читаю с интересом в т.ч. нубские вопросы -- они дают возможность оценить языки программирования с точки зрения их дизайна -- насколько прямо они понимаются. Так что даже детсадовские вопросы удалять не стоит.
Или уже считается, что ссылка на технический текст на английском языке испугает целевую аудиторию ресурса? За кого тут нас принимают?
Речь идет о новости http://www.linux.org.ru/view-message.jsp?msgid=3955302
Гугление результатов не принесло.
Задача: заставить материнку перезагружаться в случае, если линукс мертво завис (было пару раз за полгода).
Ядро железку видит:
iTCO_wdt: Intel TCO WatchDog Timer Driver v1.02 (26-Jul-2007)
iTCO_wdt: Found a ICH5 or ICH5R TCO device (Version=1, TCOBASE=0x0860)
iTCO_wdt: initialized. heartbeat=30 sec (nowayout=0)
root 5 0.0 0.0 0 0 ? S< Aug07 0:00 [watchdog/0]
Еще надо как-то симулировать мертвое зависание... oops, что ли, сделать? как?
Еще вопрос — материнку на перезагрузку будет толкать железка или все же ядро?
Два линукса, 2 рута. Сетевые карты желательно разделить между ними -- каждому свои карты. Жесткие диски, возможно, тоже каждому свои, а возможно и рейд, который совместно используется -- возможно такое? Интересуют все варианты.
Вот исходники
#include <stdio.h>
#define BITS 10 // 0<=BITS<=16
unsigned int i0=0, i1=0;
int f(unsigned int arg)
{
if( ( (arg>>16) & ((1<<BITS)-1) ) == 0 )
return 1; // exception
else
++i0; // do some good work here, i.e. increment i0
return 0; // ok
}
int main()
{
unsigned int i=0, x=1;
do {
++i;
x+=x<<2; // x == 5 power i
if( f(x) )
++i1; // exception
}
while(x!=1);
printf("i=%u i0=%u i1=%u i0+i1=%u\n", i,i0,i1,i0+i1 );
printf(" %u %u %u %u\n", 0x40000000u, i-i1, (1<<(16-BITS))<<14, 0x40000000u );
return 0;
}
#include <stdio.h>
#define BITS 10 // 0<=BITS<=16
unsigned int i0=0, i1=0;
class E1 {};
E1 e1;
void f(unsigned int arg)
{
if( ( (arg>>16) & ((1<<BITS)-1) ) == 0 )
throw &e1;
else
++i0; // do some good work here, i.e. increment i0
}
int main()
{
unsigned int i=0, x=1;
do {
++i;
x+=x<<2; // x == 5 power i
try{ f(x); }
catch( E1* e ){ ++i1; }
}
while(x!=1);
printf("i=%u i0=%u i1=%u i0+i1=%u\n", i,i0,i1,i0+i1 );
printf(" %u %u %u %u\n", 0x40000000u, i-i1, (1<<(16-BITS))<<14, 0x40000000u );
return 0;
}
Вот выхлопы [ gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) ]:
$ gcc -O3 1.c && time ./a.out
i=1073741824 i0=1072693248 i1=1048576 i0+i1=1073741824
1073741824 1072693248 1048576 1073741824
real 0m2.368s
user 0m2.256s
sys 0m0.004s
$ g++ -O3 1.cxx && time ./a.out
i=1073741824 i0=1072693248 i1=1048576 i0+i1=1073741824
1073741824 1072693248 1048576 1073741824
real 0m11.741s
user 0m10.921s
sys 0m0.008s
Кто сможет протестить на icc, других версиях gcc и других железках? Возможно, я не указал полезные опции? А дальше флейм :-)
Министерство юстиции США начало расследование в отношении Google, Apple, Yahoo и некоторых других крупных компаний (в частности, Genentech) по обвинению в сговоре не переманивать друг у друга ключевых сотрудников.
Напомню также, что в мае FTC начала расследование отношений Google и Apple по поводу того, что ряд сотрудников входит в совет директоров обоих компаний. Например, в совет директоров Apple входит исполнительный директор Google Эрик Шмидт, и что членом совета директоров обеих компаний является Артур Левинсон, бывший исполнительным директором Genentech. Это, по мнению коммисии, препятствует свободной конкуренции компаний, являющихся естественными конкурентами (iPhone <=> Android, iTunes <=> YouTube).
Подробности
Перемещено Shaman007 из Apple
Обратный пункт "Отсутствие анонимного постинга" есть. А прямого нет.
З.Ы. Для тех, кто не видит логики:
Сейчас, при "Отсутствие анонимного постинга", вполне возможно, и не стал бы регистрироваться тут. Лень регистрироваться ради пары комментов.
← назад | следующие → |