- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
// fib.h
#pragma once
using ull = unsigned long long;
inline constexpr ull fib(size_t n, ull first, ull second) {
return n == 0 ? first : fib(n - 1, second, first + second);
}
inline constexpr ull fib(size_t n) {
return fib(n, 0, 1);
}
// fibs.h
#pragma once
#include "fib.h"
#include <array>
enum class fibs : ull {
#define FIB(i, val) fib##i = val,
#define COUNT(val) COUNT = val
#include "fibs.inl"
#undef COUNT
#undef FIB
};
std::array<ull, static_cast<size_t>(fibs::COUNT)> const & fibs_values() {
static std::array<ull, static_cast<size_t>(fibs::COUNT)> values = {
#define FIB(i, val) val,
#define COUNT(val)
#include "fibs.inl"
#undef COUNT
#undef FIB
};
return values;
}
// main.cpp
#include "fibs.h"
#include <iostream>
int main() {
using namespace std;
for (auto fib : fibs_values()) {
cout << fib << "," << endl;
}
return 0;
}
// fibs.inl = gen.exe > fibs.inl
// gen.cpp
#include "fib.h"
#include <iostream>
int main() {
using namespace std;
size_t i;
for (i = 0; i < 94; i++) {
cout << "FIB(" << i << ", " << fib(i) << ")" << endl;
}
cout << "COUNT(" << i << ")";
return 0;
}
LispGovno 04.12.2013 11:08 # +4
Abbath 04.12.2013 12:03 # +1
3.14159265 04.12.2013 12:36 # +5
kipar 04.12.2013 12:58 # 0
3.14159265 04.12.2013 13:12 # +2
>> Но как, С++ же еще не было!
Открою страшную тайну: язык развивается и периодически появляются новые версии стандарта. Вот уже С11. K&R успели увидеть в какое чудовище превратились кресты.
TarasB 04.12.2013 13:14 # +2
kipar 04.12.2013 15:55 # 0
inkanus-gray 04.12.2013 13:42 # +8
Ритчи и Томпсон жили по этому принципу. Долгое время после того как ресурсные ограничения на ранних Unix-программах были смягчены, они работали над тем, чтобы поддерживать С в виде настолько тонкого уровня над аппаратным обеспечением, насколько это возможно.
Когда я просил о какой-либо особенно экстравагантной функции в С, Деннис обычно говорил мне: «Если тебе нужен PL/I, ты знаешь, где его взять». Ему не приходилось общаться с каким-либо маркетологом, утверждающим: «На диаграмме продаж нам нужна галочка в рамочке!»“
bormand 04.12.2013 13:45 # +5
Stertor 04.12.2013 13:55 # −3
bormand 04.12.2013 15:31 # +1
3.14159265 04.12.2013 15:42 # +5
Компактность — свойство, которое позволяет конструкции поместиться в памяти человека. Для того чтобы проверить компактность, используем тест:нуждается ли обычно опытный пользователь в руководстве для работы с данной программой. Если нет, то конструкция (ее подмножество, которое охватывает обычное использование) является компактной.
Компактные программные средства обладают всеми достоинствами удобных физических инструментов. Их приятно использовать и они не препятствуют работе.
Компактность-не синоним слабости. Конструкция может обладать мощностью и гибкостью, оставаясь при этом компактной, если она построена на абстракциях, которые просты в осмыслении и хорошо взаимосвязаны. Компактность не эквивалентна "простоте обучения". Некоторые компактные конструкции являются весьма сложными для понимания до тех пор, пока пользователь не овладеет основополагающей концептуальной моделью настолько, что его мировоззрение изменится, благодаря чему компактность станет для него простой.
Для многих классическим примером такой конструкции является язык Lisp.
Очень немногие программные конструкции являются компактными, однако многие являются полукомпактными . Они имеют подмножество возможностей, подходящее для решения >=80% типичных задач. На практике для таких конструкций обычно требуется памятка, но не руководство.
Библиотека С включает в себя сотни входных точек, которые не поместятся в памяти программиста.
Статья Magical Number Seven, Plus/Minus Two показывает, что количество дискретных блоков информации, которое человек способен удерживать в краткосрочной памяти, равно 7±2. Из этого следует хорошее правило для оценки компактности API-интерфейсов: необходимо ли помнить более семи входных точек?
Среди универсальных языков программирования С и Python являются полукомпактными, a Perl, Java, Emacs Lisp и shell — нет.
С++ — антикомпактный язык — его разработчик признал, что вряд ли какой-либо один программист когда-нибудь поймет его полностью.
defecate-plusplus 04.12.2013 15:53 # 0
3.14159265 04.12.2013 15:58 # 0
особенно ввиду того, что серьезное shell-программирование требует от разработчика знаний нескольких других средств, таких как sed и awk
anonimb84a2f6fd141 05.12.2013 16:46 # +1
TarasB 04.12.2013 19:41 # +4
roman-kashitsyn 04.12.2013 20:50 # +2
Степанов на лекции в яндексе в 2011 году о подобном говорил, когда пиарил свою тоскливую Elements of Programming. Типа он плюсов не знает, пишет самые примитивные конструкции.
anonimb84a2f6fd141 09.12.2013 01:48 # +2
LispGovno 09.12.2013 06:26 # 0
вас ещё полезному чему-то учили.
anonimb84a2f6fd141 09.12.2013 07:27 # 0
eth0 09.12.2013 17:33 # +1
Программист - творец, компилятор - критик.
anonimb84a2f6fd141 09.12.2013 19:37 # −2
spivti 04.12.2013 20:03 # 0
вывод ц ++ изучать можно бесконечно долго. Т.е. дзена не постичь, а оно нада?
defecate-plusplus 04.12.2013 20:14 # +6
и да, всё тщетно, мы все умрём
anonimb84a2f6fd141 09.12.2013 01:49 # +1
defecate-plusplus 09.12.2013 07:53 # +1
спроецируй на многогранность профессиональной области "разработка ПО"
кому интересно посмотреть свое знание в попугаях - на брейнбенче вполне показательные тесты. где при этом 100 баллов знания синтаксиса нихуя не помогут в написании идеальной программы с идеальной рахитектурой
не найдешь человека, который на 100% знает "разработку ПО", имеет опыт и навык и понимание абсолютно всех подводных камней одновременно в разработке ПО для микроконтроллеров, телефонов, десктопов, серверов, кластеров, умеет работать максимально эффективно с любой субд и даже напишет свою, перепишет ядро ос, доработает драйвер видеокарты, напишет компилятор, разработает новый алгоритм сортировки, а затем сделает с нуля опенофис, пакет нелинейного видеомонтажа, распознавание лиц, предсказание курса валют и непобедимого биржевого робота, управление ядерным щитом страны и твд, шахматного монстра, гуглопоиск...
а потом скажет, что это был скучный вторник и c++ ему надоел
anonimb84a2f6fd141 09.12.2013 08:07 # 0
Гораздо лучше, чем без этого.
Есть вещи более простые, а есть более сложные. Неужели это так тяжело понять?
roman-kashitsyn 04.12.2013 12:59 # +3
3.14159265 04.12.2013 14:13 # +3
LispGovno 04.12.2013 20:28 # +3
LispGovno 06.12.2013 09:49 # 0
LispGovno 04.12.2013 20:25 # +1
bormand 04.12.2013 20:51 # +3
LispGovno 05.12.2013 09:01 # −1
bormand 05.12.2013 09:52 # +4
inkanus-gray 05.12.2013 10:30 # +4
bormand 05.12.2013 12:37 # +3
В эрланге тоже нет циклов, и ничего, пишут. А тут даже макрос для цикла можно замутить.
> использовать препроцессор для самого m4.
Да вроде бы не надо юзать препроцессор для самого м4, достаточно рекурсивный макрос поюзать.
inkanus-gray 07.12.2013 05:32 # +2
Чтобы сделать цикл без переменных, нужно пробежать селектом по таблице, содержащей все натуральные (целые) числа. А чтобы получить псевдотаблицу всех натуральных (целых) чисел, нужно читать далее >>>
http://use-the-index-luke.com/blog/2011-07-30/mysql-row-generator
defecate-plusplus 07.12.2013 10:13 # +2
select level from dual connect by level < 16
kegdan 05.12.2013 16:38 # +1
bormand 05.12.2013 10:01 # +2
inkanus-gray 05.12.2013 10:51 # +2
wvxvw 05.12.2013 10:54 # 0
guest 06.12.2013 05:13 # +3
LispGovno 05.12.2013 09:09 # 0
bormand 05.12.2013 09:53 # 0
ФВП ;) По крайней мере рекурсия будет инкапсулирована в реализацию этих ФВП.
roman-kashitsyn 05.12.2013 09:56 # +2
В eager языках вроде Ocaml есть обычные циклы, типичная сишка. Но от этого языка меня воротит. Уж лучше на плюсах писать.
В erlang нету циклов, только tail recursion и list comprehensions.
В целом, да, стандартная библиотека языков с eager-вычислениями обычно предлагает HO-функции, скрывающие хвостовую рекурсию.
LispGovno 08.12.2013 14:35 # 0
А потом с заоблачных вершин гадать о том куда и с какой вероятностью попадет кинутый сверху код? И никогда точно не угадаешь волю силы тяготения (компилятора или jit).
Наверное стоит вспомнить заветы дедушки Кнута и писать как нравится. А допиливать уже по необходимости - с профилировщиком и ассемблерным выводом.
Или писать на том же С++ и явно указывать что нужен цикл, а не рекурсия.
guest