Отколол уголок от хинкпада.
Зато теперь не скрипит при надавливании.
Вот в D есть удобная функция format.
А в крестах на выбор три варианта: либо си-портянка, либо sstream-портянка, либо бустопортянка.
Сделал норм:
#include <boost/format.hpp>
#include <string>
std::string format_(boost::format &fmt)
{ return fmt.str(); }
template <typename A, typename ... Args>
std::string format_(boost::format &fmt, const A& a, Args...args)
{ return format_(fmt % a, args...); }
template <typename ... Args>
std::string format(const std::string &fmt, Args...args)
{
boost::format fmt_(fmt);
return format_(fmt_, args...);
}
Usage:
std::string a = format("[%d, '%s', 0x%x]", 1, ":3", 359);
Применительно к заметкам (например, в org-mode
).
Автоматически коммитить в VCS после каждого сохранения в текстовом редакторе. // уау, как в Википедии
А потом рисовать такой таймлайн, где каждая *
— это коммит:
05.02.2014 | 06.02.2014 | 07.02.2014
----*-**-*--------+----**---------*-**--***-----+-----*-*-------->
^ ^ ^ ^
В конце каждого кластера *
(помечено ^
) [скорее всего] будет логически завершенный коммит. Остальные коммиты нужны для того, чтобы схоронять незаконченные и отброшенные мысли.
От Линукса зависимости нет; любой линуксоид, если захочет, может бросить Линукс в любой момент.
Писать эффективные вычматы на чистом C — содомия, поскольку кроме убогого препроцессора средств метапрограммирования нет.
Альтернатвы:
1) Более лучший препроцессор, например erb
(Ruby). Минус — неудобно возиться с получившимся выхлопом (отладка, балансировка скобочек, етц).
2) Языки, в которых можно явно указать, какие вычисления будут происходить в compile-time. Например, C++ (шаблоны, constexpr).
Хочу попробовать D в качестве второй альтернативы. Есть гнутый компилятор, который [по мнению авторитетных анонимных экспертов] даёт на выхлопе код, не хуже, чем gcc.
Вот есть такая штука:
template<class F>
void foo(F f) {
for(int i = 0; i < 100; i++)
f(i);
}
Наверное, это очевидно, но gcc не инлайнит¹ вызов f
, если f
- это функция. Поэтому приходится писать
template <void f(int)>
void foo() { /* ... */ }
Либо оборачивать f
в какую-нибудь лямбду или класс с оператором ()
.
1) На самом деле инлайнит, если foo()
используется только один раз в коде.
locale-gen
при попытке сгенерировать локаль en_GB.UTF-8
срал ошибками вида
en_GB:1454: syntax error: not inside a locale definition section
Такая же хуйня была и с en_US.UTF-8
. Пришлось даже пидорахинскую локаль сгенерировать, не с C
же сидеть.
А всё, оказывается, почему? Да потому что в $PWD
лежали левые файлы en_US
и en_GB
.
GADTs и GeneralizedNewtypeDeriving противоречивы.
migmit: GeneralizedNewtypeDeriving
TIL экзистенциальный типы и то, что при помощи них можно сделать динамическую диспетчеризацию. Интересно, можно ли в х-ле сделать динамическую множественную диспетчеризацию?