// все три следующих варианта корректны и работают одинаково 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. А уж какое кустарное говно там внутри стандартной библиотеки - ебал и плакал. Всё, не взлетело, закапываем трупешника.
объектно-ориентированный
процедурный
функциональный
обобщённый,
параллельный,
мультипарадигмальный,
императивный,
компилируемый
Официальный сайт: https://dlang.org/
Русский сайт: http://dlang.ru/
Онлайн редактор: https://run.dlang.io/
Git: https://github.com/dlang
Примеры кода.
//////////////////////////////////
import std.stdio;
void main()
{
writeln ("Hello, world!");
}
//////////////////////////////////
//////////////////////////////////
import std.stdio;
import std.algorithm;
import std.array;
void main()
{
auto a = [2, 4, 1, 3];
// все три следующих варианта корректны и работают одинаково
writeln(a); // "классический" C-подобный вариант
a.writeln(); // функция вызывается так, как будто является методом объекта "a", хотя и не является таковой
a.writeln; // функцию без параметров можно вызывать без скобок
// это позволяет использовать цепочки вызовов, характерные для функциональных языков
int[] e = a.sort().reverse;
// многострочная цепочка вызовов также возможна
stdin
.byLine(KeepTerminator.yes)
.map!(a => a.idup)
.array
.sort;
}
//////////////////////////////////
//////////////////////////////////
Сортировка массива
import std.stdio, std.array, std.algorithm;
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;
int first (int[] arr) {
return arr[0];
}
unittest {
int[] arr1 = [1, 2, 3];
int[] arr2 = [10, 15, 20];
assert(first(arr1) == 1);
assert(first(arr2) == 10);
}
//////////////////////////////////
|/////////////////////////////////
Минимальный веб-сервер
#!/usr/bin/env dub
/+ dub.sdl:
dependency "vibe-d" version="~>0.8.0"
+/
void main()
{
import vibe.d;
listenHTTP(":8080", (req, res) {
res.writeBody("Hello, World: " ~ req.path);
});
runApplication();
}
|/////////////////////////////////