- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
отгадай язык и что делает эта процедура
[code]
template<class T, class U>
auto add(T t, U u) -> decltype(t + u)
{
return t + u;
}
[/code]
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−16
отгадай язык и что делает эта процедура
[code]
template<class T, class U>
auto add(T t, U u) -> decltype(t + u)
{
return t + u;
}
[/code]
imihajlov 11.11.2015 16:39 # +3
dim1r 11.11.2015 16:54 # −1
TarasB 11.11.2015 16:54 # −1
roman-kashitsyn 11.11.2015 16:58 # +2
Недавно об этом срач был на кабре
nihau 11.11.2015 17:39 # +3
Vasiliy 11.11.2015 17:53 # −1
roman-kashitsyn 11.11.2015 18:01 # +1
Vasiliy 11.11.2015 18:04 # +1
roman-kashitsyn 11.11.2015 18:05 # 0
inkanus-gray 11.11.2015 18:09 # −1
Vasiliy 11.11.2015 18:11 # 0
bormand 11.11.2015 18:12 # +2
Главное не забывать, что это не замыкания.
TarasB 12.11.2015 11:33 # 0
dim1r 11.11.2015 18:31 # −1
bormand 11.11.2015 18:32 # +3
Vasiliy 11.11.2015 18:35 # +1
dim1r 11.11.2015 18:28 # −7
dim1r 11.11.2015 19:38 # −9
Vasiliy 11.11.2015 19:53 # −2
dim1r 12.11.2015 12:02 # −1
Antervis 12.11.2015 06:39 # +1
dim1r 12.11.2015 09:27 # −1
"нововведения нам нужны для удобства, а удобства, - что бы запутывать"
Antervis 12.11.2015 10:08 # 0
... функцию абстрактного сложения двух аргументов*
dim1r 12.11.2015 10:17 # −3
defecate-plusplus 12.11.2015 10:26 # +1
тормозное малофункциональное синтаксически-избыточное говно из 80х
в нем как раз и не хватает темплейтов и приходится вымораживаться через execute immediate
dim1r 12.11.2015 10:40 # −4
defecate-plusplus 12.11.2015 11:11 # +3
первое позволяет сэкономить те самые связи, т.к. обобщенное программирование позволяет писать код один раз, а использовать - много
если программист не может написать шаблонную функцию так, чтобы она не была очевидной, либо хотя бы её не приходилось переписывать другому программисту - ну тут не инструмент виноват, например
а уж о преимуществах инкапсуляции (модульности, изоляции кода и приватных данных), "контракта" (в виде интерфейсов/классов), позднего связывания (полиморфизма) в больших проектах и спорить не стоит
> по 2 месяца нихрена не понимают
не всем можно в эту сложную профессию, пусть идут работать по инструкции
dim1r 12.11.2015 11:22 # −1
не, программисты очень опытные, но проект такой, что бывают нервные срывы.
defecate-plusplus 12.11.2015 11:30 # +1
что за проект такой, что ни логики, ни комментариев?
dim1r 12.11.2015 11:47 # −1
roman-kashitsyn 12.11.2015 11:49 # +4
dim1r 12.11.2015 11:57 # −2
defecate-plusplus 12.11.2015 11:58 # 0
но сейчас толпа заминусует, конечно
dim1r 12.11.2015 11:34 # −1
Иногда гибкость вредна, мне известно много таких случаев. Программисты и пользователи начинают что-то предполагать, потом делать на основе предположений, потом запутываются сами и еще сильнее запутываются после смены требований.
потом бросают все и делаю так
if(old_version){ 10 тыс строк кода}
if(new_version){ Control-C Control-V 10 тыс строк кода c небольшими правками}
Antervis 12.11.2015 07:04 # +2
имо есть пара изъянов, связанных с объявлением типов, но они вообще в других местах.
Указатели на функцию: я хочу вводить *int(int,int) func_ptr; вместо int(*funct_ptr)(int,int);
Или, например:
int A[10][10];
int (*B)[10][10];
что здесь массив указателей, а что - указатель на массив? Почему бы не сделать
*[10]int A; - указатель на массив из 10 элементов типа int
[10]*int A; - массив из десяти указателей на int.
И эти недочеты не уйдут от смены типа объявления переменной
imihajlov 12.11.2015 10:25 # +1
roman-kashitsyn 12.11.2015 11:21 # +2
Где я такое говорил? Я лишь говорил, что Стиль (Способ) Объявления Переменных Рулит. Он появился ещё до сишки, но K&R почему-то решили его не использовать. Во многих нормально спроектированных языках используется именно такой подход (SML, Ocaml, Haskell, Scala, Rust, Nemerle, Go, ...)
> не значит, что язык плохо спроектирован
Кмк, то, что нужно вводить второй синтаксис для указания типа, означает как раз это. Вроде бы всем очевидно, что с точки зрения априорного дизайна C++ - полное УГ. Другое дело, что текущий дизайн является в некотором роде локальным оптимумом - движение в любую сторону только навредило бы развитию языка, это становится очевидно из единственной читабельной книжки Страуструпа - "The Design and Evolution of C++".
> И эти недочеты не уйдут от смены типа объявления переменной
Эти недочёты фиксятся тривиально, достаточно ввести один регулярный синтаксис построения типа:
Antervis 12.11.2015 11:37 # 0
Проблемы, которые сейчас есть у синтаксиса c++, не решить введением var и перенесением типа переменной правее названия.
По нотации, которую вы предлагаете:
var main : Func[argc : int, argv : Ptr[Array[char]]] ...
точно проще читать?
roman-kashitsyn 12.11.2015 11:45 # +3
Начнём с того, что проблемы синтаксиса C++ вообще уже ничем не решить - любые изменения будут только добавлять проблем. Речь идёт о том, что проблем можно было бы избежать, если бы K&R 50 лет назад сделали синтаксис объявления переменных как в Pascal, а не как в Fortran.
> точно проще читать?
Синтаксис должен быть скорее таким:
Func[X, Y, R] нужен для ссылок на фукнции, fn - для объявления/определения функций.
Antervis 12.11.2015 12:09 # 0
roman-kashitsyn 12.11.2015 12:15 # +1
А можно пример? Что-то я не вижу, откуда берётся такой синтаксический оверхед. Ну разве что заменили звезду на Ptr, скобки с числом - на Array.
Сырые указатели в крестах я использую очень редко, а массивы с размерностью передавать параметром функции в сишке/крестах - нонсенс.
Antervis 12.11.2015 14:48 # 0
В вашем же примере:
fn main(argc: Int, argv : Ptr[Ptr[Char]]]): Int // 47 символов
вместо
int main(int argc, char** argv) // 31 символ
И где же оверхед?
В tuple, например, вполне можно засунуть, например, двумерный массив комплексных чисел (как удобно, так и десериализую). И мне совершенно не нужна пара десятков лишних символов в объявлении такой конструкции.
roman-kashitsyn 12.11.2015 14:52 # +1
> пара десятков лишних символов
Не вяжется как-то.
> совершенно не нужна пара десятков лишних символов в объявлении такой конструкции
Тайпдефы в помощь.
Antervis 12.11.2015 15:05 # 0
Затайпдефать я могу хоть любой тип, который использую, и причина, по которой я этого не делаю - генерируются много бестолковых строк кода там, где они совсем не нужны. И говорить "лучше писать больше кода чтобы делать больше тайпдефов чтобы в итоге всё стало как было + объявление тайпдефа" глупо.
И да, если вам так нравятся паскалевские нотации, флаг в руки:
typedef auto fn;
fn someFunc(int a, int b) -> int { return a+b; }
Но почему то же вы так не делаете
roman-kashitsyn 12.11.2015 15:16 # +3
Так это для переменных тоже нужно, не только для функций.
Ну и мой текстовый редактор от этого не начнёт лучше понимать долбанутые крестовые конструкции.
> Затайпдефать я могу хоть любой тип... я этого не делаю
А вот я очень активно использую тайпдефы. Они позволяют создавать бесплатные абстрации и делают код более читабельным. Кусок кода из реального проекта:
> глупо
А мне вот кажется, что экономить на символах в ущерб понятности и читаемости - глупо.
Antervis 12.11.2015 15:24 # 0
Мб дело не в крестах, а в текстовом редакторе?
> Кусок кода из реального проекта:
Приведенный пример хорош, но я не с этим спорю. Мне не нравится идея использовать тайпдефы там, где их необходимость обусловлена ТОЛЬКО громоздкостью конструкции.
> А мне вот кажется, что экономить на символах в ущерб понятности и читаемости - глупо.
Малое количество смысла в большом куске текста тоже затрудняет восприятие.
roman-kashitsyn 12.11.2015 15:29 # +1
Громоздкость конструкции означает, что где-то потерялась абстракция.
> Мб дело не в крестах, а в текстовом редакторе?
Текстовый редактор отличный, из двух десятков языков у него только с крестами проблемы :) Не у него одного, кстати. Без привязки к компилятору кресты вообще подкрашивать очень сложно, регулярками не обойтись.
Antervis 13.11.2015 06:42 # 0
У меня есть строка в 20-30 символов, которая понятна и без абстракций. По вашему, надо её расписать на 40 символов, и то, что она при этом станет громоздкой, вызвано тем, что в ней "потерялась абстракция". Не путайте причины и следствия, пожалуйста
roman-kashitsyn 13.11.2015 09:50 # 0
> громоздкой
У вас какие-то странные представления о громоздкости. Вот это громоздко, и тут никакие тайпдефы не помогут :)
Antervis 13.11.2015 11:53 # 0
TarasB 12.11.2015 16:55 # +1
inkanus-gray 12.11.2015 16:56 # 0
Antervis 12.11.2015 20:45 # 0
TarasB 13.11.2015 10:37 # 0
Antervis 13.11.2015 11:02 # 0
Речь не о символах языка/фреймворков
TarasB 13.11.2015 11:57 # 0
Antervis 13.11.2015 12:03 # 0
TarasB 12.11.2015 14:05 # 0
roman-kashitsyn 12.11.2015 14:40 # 0
Нет, мне что-то не очень нравятся имена объектов вперемешку с именами типов без дополнительных конструкций вроде какого-нибудь TypeOf Правда, в Ocaml этому есть применение: там имена аргументов могут быть частью контракта функции, так работают именованные и опциональные аргументы, их можно передавать в различном порядке.
TarasB 12.11.2015 17:11 # 0
Abbath 18.11.2015 13:51 # 0
wvxvw 14.11.2015 14:30 # 0
TarasB 16.11.2015 10:53 # −1
Bobik 15.11.2015 19:50 # 0
template<class T, int N> using Array<T, N> = T[N];
template<class T, class... Arg> using Func<T, Arg> = T()(Arg...);
и прочее в myproject.h -- и на плохом языке можно писать хороший код.
За синтаксис в последней строке не отвечаю.
Antervis 16.11.2015 06:12 # 0
получится как тут
TarasB 16.11.2015 10:55 # 0
Antervis 16.11.2015 12:20 # 0
1024-- 12.11.2015 18:57 # 0
>> var a : Ptr[Array[Int, 10]]
> точно проще читать?
Точно проще читать.
1. По умолчанию с типами творится какая-то странная каша. Типы-слова (int, float), типы-символы (*,[]), типы-функции (std::vector) - не сведено к общему знаменателю, запутывает.
2. Типы в общем случае принимают более одного аргумента и представляют собой какое-то выражение.
У Вас тип - линейная питушня, которая не расширяется на общий случай.
У Романа - симметричная система записи без странных исключений.
Antervis 13.11.2015 07:00 # 0
Предположим, существует язык, в котором эквивалентом строки
std::string (*makeHash)(const char *string, int32_t seed);
является
declare variable makeHash as pointer_to function taking pointer_to const char and unsigned int32 returning type string from std;
Это гиперболизация, офк, но, исходя из ваших комментариев выше, такой язык является чуть ли не идеалом, к которому надо стремиться. И я повторю вопрос: удобно читать?
Зачастую скорость восприятия обусловлена только скоростью чтения.
TarasB 13.11.2015 10:38 # −1
1024-- 13.11.2015 11:25 # +1
std::string (*makeHash)(const char *string, int32_t seed);
является
№!::~~ [[*make#]](!! ~ *~~, @32 seed);
Любую запись можно гиперболизировать.
> Зачастую скорость восприятия обусловлена только скоростью чтения.
Да, в частном случае char* читается легче, чем ref<char>
Да, значки часто удобнее в программировании и математике. Несколько раз я участвовал в обсуждениях на эту тему, где стоял за значки именно из-за скорости восприятия компактных выражений.
Но здесь в чуть более сложных случаях, чем char* начинается какая-то фигня с *, [], const, volatile, функций. Становится проще запомнить, как описывается указатель массив, чем пытаться вычислять.
Но от сложных структур чаще всего отказываются, из-за чего они встречаются гораздо реже, чем более простые. А значит фиг тут что выучишь, фиг что посчитаешь, т.к. в следующий раз встретишь этот набор скобок и звёзд не так скоро.
В итоге, начиная где-то с измерения 2-3, запись Романа уже проще, чем обычная сишная из-за того, что прочитать длинную понятную строчку легче, чем раздумывать над короткой и менее понятной.
Но вообще, самая лучшая, самая короткая и самая понятная запись типа - в JSON. Видим значение - видим его тип. Без посредников:
В сишном стиле это было бы что-то вроде object x{char*}[]{char*}.
В C++ - map<string, vector<map<string, object>>> x.
В JSON: нет записи - нет проблем.
Antervis 13.11.2015 11:38 # 0
> Любую запись можно гиперболизировать.
Вывод: регулярки придумал сам дьявол
Я пытаюсь оспорить утверждение, что "вот так лучше, чем в плюсах", а не доказать, что "спецсимволы лучше слов потому что короче".
Abbath 18.11.2015 14:21 # +1
dim1r 13.11.2015 11:40 # −1
хорошая идея
roman-kashitsyn 13.11.2015 11:42 # 0
Скорее - нет (известного на этапе трансляции) типа - не нужно писать тип.
В таких случаях помогает вывод типов - писать не надо, а компилятор осведомлён.
roman-kashitsyn 13.11.2015 11:37 # +1
Antervis 13.11.2015 12:06 # 0
using CString = const char*;
using Int32 = int32_t;
using String = std::string;
roman-kashitsyn 13.11.2015 12:27 # 0
> using CString = const char*;
Не забыл, а предположил, что стандартная библиотека делает очевидный тайпдеф для такого частого кейса.
> using Int32 = int32_t;
Это даже не смешно
> using String = std::string;
Лол, ну пусть будет Std.String
Antervis 13.11.2015 12:42 # 0
roman-kashitsyn 13.11.2015 13:00 # 0
Нет уж, мне некогда этим заниматься. Люди пытались запилить годноту в Clay, но он, кажется, помер
Antervis 16.11.2015 12:21 # 0
Как однажды заявил Страуструп: "есть два типа языков программирования: те, которые все критикуют, и те, которыми никто не пользуется"
kegdan 16.11.2015 13:16 # −2
Antervis 16.11.2015 13:23 # 0
kegdan 16.11.2015 13:25 # −2
2 отловить всех крестоблядей и сжечь
3 ???
4 PROFIT
Antervis 16.11.2015 13:30 # 0
kegdan 16.11.2015 13:32 # 0
Antervis 16.11.2015 13:35 # +1
kegdan 16.11.2015 13:36 # 0
ты сам это сказал
на сях
Antervis 16.11.2015 13:45 # 0
kegdan 16.11.2015 14:23 # +1
guest 17.11.2015 04:45 # +1
TarasB 12.11.2015 11:42 # +1
Потому что я предлгаю сахарок: последний параметр можно указывать в конце после слова of. Только последний, чтоб не было путаницы
1024-- 12.11.2015 19:10 # 0
А вообще, частичное применение и каррирование типов нужно обязательно предусмотреть. Ну и другие типопреобразователи вроде хаскелевского flip, а то и вовсе какой-нибудь функциональный язык использовать для описания типов.
Скажем,
inkanus-gray 12.11.2015 19:41 # 0
Крестовикам не привыкать. Когда добавили шаблоны, пришлось ради шаблонов изобретать новый язык.
Вот pure-сишникам будет тяжелее.
1024-- 12.11.2015 19:54 # 0
Из-за чего? Они не смогут смириться из-за того, что пон*ятн*ые[] царские звёздочки и скобочки заменят на длинные попсовые слова? Или из-за конфликта императивного подхода кода с новой функциональной типарадигмой?
Antervis 12.11.2015 20:39 # 0
guest 13.11.2015 23:11 # +3
Раньше только ТруСишник мог с ходу написать сигнатуру функции которая возвращает указатель на массив константных указателей на структуру. А теперь каждый лох сможет.
TarasB 13.11.2015 10:39 # 0
Abbath 12.11.2015 15:39 # 0
Antervis 12.11.2015 20:39 # 0
3_14dar 11.11.2015 22:31 # 0
c++?
bormand 11.11.2015 22:38 # 0
3_14dar 11.11.2015 22:53 # 0
kegdan 11.11.2015 22:54 # −2
Vasiliy 11.11.2015 23:54 # −2
3_14dar 12.11.2015 01:05 # +2
Steve_Brown 12.11.2015 16:06 # −1
myaut 12.11.2015 01:01 # +2
inkanus-gray 12.11.2015 01:03 # 0
dim1r 12.11.2015 22:05 # 0
3_14dar 13.11.2015 00:22 # 0
Antervis 12.11.2015 08:04 # +2
dim1r 12.11.2015 12:06 # 0
Vasiliy 12.11.2015 13:51 # +1
dim1r 12.11.2015 14:01 # −1
Abbath 12.11.2015 15:40 # +3
dim1r 13.11.2015 09:23 # −1
cawayz 24.11.2015 01:09 # −1
bormand 24.11.2015 06:17 # +1
kegdan 24.11.2015 06:20 # −1
1024-- 24.11.2015 11:01 # −1
Stallman 24.11.2015 11:02 # −1
kegdan 24.11.2015 11:04 # −1
cawayz 24.11.2015 22:00 # +1
kegdan 24.11.2015 22:03 # −1
1024-- 24.11.2015 22:56 # 0
cawayz 24.11.2015 23:10 # 0
1024-- 24.11.2015 23:19 # −1
cawayz 24.11.2015 23:35 # −2
CHayT 24.11.2015 23:57 # +1
> громоздкой
У вас какие-то странная каша. Типы-слова (int, float), типы-функции внутри другие типов - писать сигнатуру функции которая понятная запись Романа уже проще, чем обычная сишная из-за скоростью чтения. Когда добавили шаблонов изобретать новый язык.
Раньше только скоростью чтения. Когда не понимать долбанутые крестовые конструкции.
> А мне вот кажется, что это опошляет язык, в которому надо стремиться. И я повторю вопрос: удобно, так и десериализую). И мне совершенно не нужно