// все три следующих варианта корректны и работают одинаково writeln(a); // "классический" C-подобный вариант a.writeln(); // функция вызывается так, как будто является методом объекта "a", хотя и не является таковой a.writeln; // функцию без параметров можно вызывать без скобок
// это позволяет использовать цепочки вызовов, характерные для функциональных языков int[] e = a.sort().reverse;
void main() { stdin .byLineCopy .array .sort!((a, b) => a > b) // descending order .each!writeln; } //////////////////////////////////
////////////////////////////////// pure int sum (int first, int second) { return first + second; }
int sum (int first, int second) pure // атрибуты можно указывать и после списка аргументов { return first + second; }
pure — функциональная чистота @safe — гарантия безопасной работы с памятью nothrow — функция гарантированно не генерирует исключений @nogc — гарантия того, что функция не содержит операций, выделяющих память на сборщике мусора @property — атрибут метода класса, позволяющий избежать использования «наивных» геттеров-сеттеров //////////////////////////////////
////////////////////////////////// В D юнит-тесты являются частью языка, их можно использовать без подключения дополнительных библиотек или фреймворков. import std.stdio;
>>1831751 Ну да, одного взгляда на этот пример достаточно, чтобы понять, почему Perl умер. И это ещё простой пример, вот когда передаёшь ссылку на массив хешей (местные словари) в функцию, начинается треш со всякими\%$$a.
>>1832335 Я по приколу попробовал запустить в онлайн-компиляторе, и похоже, что внешние переменные из такой функции нельзя изменять, и нечистые функции нельзя вызвать, будет ошибка компиляции.
>>1832352 Раз уж сабж позиционирует себя как продолжателя C/C++, то здесь наверняка вместо "функций высшего порядка" передаётся указатель на функцию: func1(&func2).
>>1832352 import std.stdio; int[] map(scope int delegate(int) f, int[] a){ auto b = new int[a.length]; foreach(i,x;a) b = f(x); return b; } void main(){ int a = 2; writeln(map(x=>ax, [1,2,3])); } ////////////////////////////// import std.stdio; T[] map(T,S)(scope T delegate(S) f, S[] a){ auto b = new T[a.length]; foreach(i,x;a) b = f(x); return b; } void main(){ int a = 2; writeln(map((int x)=>ax, [1,2,3])); writeln(map((double x)=>a*x, [1.6,2.7,3.8])); }
>>1832941 Это уже особенность того, как кресты работают с памятью, для них массив = указатель на первый элемент. Да и вряд ли кто-то пишет как в первой строке.
>>1832941 > Хотя по логике должно работать что то одно что бы не запутывать программиста когда передается массив. void print(std::vector<int> &numbers); Остальное - депрекейтед.
>>1848960 За ним нет крупной компании, за го Гугол, за растом Мозилла. Да и го ближе к питону, чем к крестам, как по мне. Отсюда вытекает отсутствие какого-либо продвижения в массы.
За крестами и питоном как бы тоже нет крупных компаний, но на них написано много софта, что создаёт спрос на специалистов.
>>1848960 Да потому что сообщество мудацкое: вместо того, чтобы объединить усилия, решили поиграть в "лебедь, рак и щука". Пока они коноёбились с тремя вечно сырыми компиляторами и двумя стандартными библиотеками, кресты слизали их фичи и выпустили новый стандарт. Сначала один, потом другой. К тому времени все, кого проект бы мог заинтересовать, уже поняли, что это бесконечный долгострой. А затем уже и раст с го вышли.
>>1854741 > го Go - не альтернатива крестам. Вообще. Совсем. Это узкопрофильный серверный язык, и то, что он компилится в нейтив, ещё ничего не значит. В остальном согласен.
>>1831712 >понравилось, как в Perl Да вы, батенька говноед. Я свою карьеру начинал в шараге, которая перлом активно пользовалась. Как вспомню, так вздрогну.
>>1855010 Да просто подход необычен с точки зрения более современных языков. Люблю экзотику. В хаскелле и лиспе вон тоже можно, но там свои причины для этого.
>>1835592 Поскольку функция не проверяет длину строки и размер буфера, она не должна использоваться для работы с данными, размер которых неизвестен, во избежание переполнения буфера dst.
Вместо strcpy рекомендуется использовать стандартную функцию strncpy (добавляя нуль-терминатор при необходимости!) или не входящие в стандарт функции strlcpy или strncpy_s.
Стандартное поведение strncpy неоптимально — функция всякий раз заполняет нулями весь остаток буфера[1][2], что приводит к непроизводительному расходу процессорного ресурса при буфере большого размера и работе с короткими строками (обычная ситуация в сетевых серверах).
То есть эти функции до сих пор не могут пофиксить.
>>1849020 Миру и один с++ не нужен. Для управляемого кода есть норм языки. Для неуправляемого - си, ди, обжектив си. Крестам место в наклепанном во времена хайпа легаси.
>>1883464 >betterC >Unrestricted use of compile-time features >Full metaprogramming facilities Спасибо за наводку, анон. А я было уж подумывал педеrustом становиться.
>>1885793 Петухон так делает, один раз пришлось долго ебаться с чем-то, чтобы выяснить, что проблема именно из-за этого, затем думать, как это выключить и указать принудительную кодировку (переменные окружения нельзя было использовать).
>>1909853 Как ты исправишь работу с памятью, например, у функции gets? Функция не знает размер буфера, и если юзер введёт больше допустимого, произойдёт выход за пределы буфера. Вместо неё, в частности, рекомендуют юзать gets_s, но там даже число аргументов другое.
>>1916785 Он последний раз был охуенен лет десять назад, а сейчас он со своими текстовыми макросами, обязательным gc и полудохлыми компиляторами сосёт по удобству даже у крестов новее c++11. А уж какое кустарное говно там внутри стандартной библиотеки - ебал и плакал. Всё, не взлетело, закапываем трупешника.