Это копия, сохраненная 5 июня 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
объектно-ориентированный
процедурный
функциональный
обобщённый,
параллельный,
мультипарадигмальный,
императивный,
компилируемый
Официальный сайт: 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();
}
|/////////////////////////////////
Это далеко не первая попытка создать D-тред, и ни одна не взлетела.
>a.writeln; // функцию без параметров можно вызывать без скобок
Самая ужасная вещь, которую только можно сделать в ЯП.
Мне понравилось, как в Perl. Там можно вообще не ставить скобки вне зависимости от количества аргументов.
Как мне сохранить указатель на функцию в переменную, если следующая конструкция вызывает функцию?
var a = func;
Ну да, одного взгляда на этот пример достаточно, чтобы понять, почему Perl умер. И это ещё простой пример, вот когда передаёшь ссылку на массив хешей (местные словари) в функцию, начинается треш со всякими\%$$a.
> И в чем проблема?
Очень хуевая читаемость кода.
> В плюсах тоже есть неочевидные моменты.
Тем не менее плюсы востребованы всегда и везде. А d как был студенческим поделием, так им и останется.
Я по приколу попробовал запустить в онлайн-компиляторе, и похоже, что внешние переменные из такой функции нельзя изменять, и нечистые функции нельзя вызвать, будет ошибка компиляции.
>И в чем проблема?
Если я хочу передать ее как функцию высшего порядка в другую функцию, то как сказать об этом компилятору?
Раз уж сабж позиционирует себя как продолжателя C/C++, то здесь наверняка вместо "функций высшего порядка" передаётся указатель на функцию: func1(&func2).
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]));
}
Аргументы равнозначны.
void print(int numbers[]);
void print(int *numbers);
Хотя по логике должно работать что то одно что бы не запутывать программиста когда передается массив.
> Хотя по логике должно работать что то одно что бы не запутывать программиста когда передается массив.
void print(std::vector<int> &numbers);
Остальное - депрекейтед.
Как с работой без gc? Всё так же стандартная библиотека от gc сильно зависит? Пробовал кто-то микроконтроллеры прогать на D?
Почему не взлетает?
На первый взгляд гораздо приятнее го/раста - по сути, единственных конкурентов в этом поле.
За ним нет крупной компании, за го Гугол, за растом Мозилла. Да и го ближе к питону, чем к крестам, как по мне. Отсюда вытекает отсутствие какого-либо продвижения в массы.
За крестами и питоном как бы тоже нет крупных компаний, но на них написано много софта, что создаёт спрос на специалистов.
Да потому что сообщество мудацкое: вместо того, чтобы объединить усилия, решили поиграть в "лебедь, рак и щука". Пока они коноёбились с тремя вечно сырыми компиляторами и двумя стандартными библиотеками, кресты слизали их фичи и выпустили новый стандарт. Сначала один, потом другой. К тому времени все, кого проект бы мог заинтересовать, уже поняли, что это бесконечный долгострой. А затем уже и раст с го вышли.
А сейчас кому он нужен?
> го
Go - не альтернатива крестам. Вообще. Совсем. Это узкопрофильный серверный язык, и то, что он компилится в нейтив, ещё ничего не значит.
В остальном согласен.
>Go - не альтернатива крестам.
Зато ди мог бы быть альтернативой го. А о крестах и речи не было.
>понравилось, как в Perl
Да вы, батенька говноед. Я свою карьеру начинал в шараге, которая перлом активно пользовалась. Как вспомню, так вздрогну.
Да просто подход необычен с точки зрения более современных языков. Люблю экзотику. В хаскелле и лиспе вон тоже можно, но там свои причины для этого.
Поскольку функция не проверяет длину строки и размер буфера, она не должна использоваться для работы с данными, размер которых неизвестен, во избежание переполнения буфера dst.
Вместо strcpy рекомендуется использовать стандартную функцию strncpy (добавляя нуль-терминатор при необходимости!) или не входящие в стандарт функции strlcpy или strncpy_s.
Стандартное поведение strncpy неоптимально — функция всякий раз заполняет нулями весь остаток буфера[1][2], что приводит к непроизводительному расходу процессорного ресурса при буфере большого размера и работе с короткими строками (обычная ситуация в сетевых серверах).
То есть эти функции до сих пор не могут пофиксить.
В плюсах надо использовать std::string, а не си с классами, где больше половины функций уже объявлено опасными.
Чтобы не ломать совместимость с сишкой и её либами, где эти функции используются. Без ломания API/ABI никак не исправить.
>Нельзя
>рекомендуется
Ну ты понел.
И в D я могу вызвать strcpy и стрелять себе в колено. Это даже в питоне можно.
Миру и один с++ не нужен.
Для управляемого кода есть норм языки.
Для неуправляемого - си, ди, обжектив си.
Крестам место в наклепанном во времена хайпа легаси.
>самого совершенного и универсального языка
А микроконтроллеры на нем программировать можно? Кросскомпилятор-то хотя бы завезли?
>>самого совершенного и универсального языка
>А микроконтроллеры на нем программировать можно?
На betterC точно да (аналог чистого C), на обычном D пока под вопросом - хеловорды работают, но бинарник жирен и всё это какая-то альфа-версия.
>Кросскомпилятор-то хотя бы завезли?
Да и давно. Рекомендую ldc2, но и gdc тоже что-то там может.
Так речь про сишку, в ней не так плохо с аби.
>betterC
>Unrestricted use of compile-time features
>Full metaprogramming facilities
Спасибо за наводку, анон. А я было уж подумывал педеrustом становиться.
Не за что.
Кстати, из betterC даже классовые методы С++ можно дёргать официально, и всё будет работать. (На случай если линкуешься с чужим кодом)
К какому пистону? Тот, который на расте? Или который на си?
Ни тому, ни другому не место на микроконтроллерах.
А, не вкурил что вы про микроконтроллеры тут. Тогда да
Писал в utf-8, это стандартная кодировка для файлов .d Вывод должен быть в OEM 866 если включена локаль
Можно переключиться на юникод коммандой chcp 65001 тогда будет норм, но стандартная кодировка 866
>Что у вашего охуитительного языка с локалью?
Сначала изучи как работает твоя говно ОС. А именно, как устроена в винде кодировка в терминале и какие там наслоения понаделали.
Этот прав:
>>1885744
Вроде, совсем недавно добавили UTF8 в терминал, так что может быть достаточно будет переключить настройку в терминале и забыть о проблеме.
>Так шиндошч-соснолька не умеет в юникод. Какие претензии к языку?
Могли бы в рантайме это учитывать и перекодирвоать налету.
Петухон так делает, один раз пришлось долго ебаться с чем-то, чтобы выяснить, что проблема именно из-за этого, затем думать, как это выключить и указать принудительную кодировку (переменные окружения нельзя было использовать).
мимо
>> конпелируемый питухон
>Ещё так любят говорить про свой язык котлинисты, шарписы и гоферы.
В принципе, так можно отличать болие лименее адекватов от PHP-ёбов
>что там с количеством стандартных библиотек в вашем Ди?
>их уже три или всё ещё две?
Скоро фобос и дрантайм объединят в одну.
Так поведение и аргументы будут теже, просто внутри функции будет исправлена работа с памятью.
Как ты исправишь работу с памятью, например, у функции gets? Функция не знает размер буфера, и если юзер введёт больше допустимого, произойдёт выход за пределы буфера. Вместо неё, в частности, рекомендуют юзать gets_s, но там даже число аргументов другое.
Буратино дали 5 яблок. Сколько их у него теперь, если неизвестно, сколько было в начале?
Так я и думал
Он последний раз был охуенен лет десять назад, а сейчас он со своими текстовыми макросами, обязательным gc и полудохлыми компиляторами сосёт по удобству даже у крестов новее c++11. А уж какое кустарное говно там внутри стандартной библиотеки - ебал и плакал. Всё, не взлетело, закапываем трупешника.
У них макросы строки генерируют, а не код.
А типы фиксированного размера?
На всякий случай, БАМП годному треду. Пусть живёт.
Это копия, сохраненная 5 июня 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.