Команда разработчиков D с великим удовольствием объявляет о выходе новой стабильной версии DMD: 2.076.0
D — это язык программирования общего назначения, мультипарадигменный, быстрый, стабильный.
Поддержка static foreach
import std.conv: to;
static foreach(i; 0 .. 10)
{
// ‘static foreach’ не добавляет вложенной области видимости
// (так же как и в ‘static if’).
// следующее объявление mixin находится в области видимости модуля
mixin(`enum x` ~ to!string(i) ~ ` = i;`); // объявляет десять переменных x0, x1, …, x9..., x9
}
import std.range: iota;
// все типы по которым можно итерироваться обычным ‘foreach’
// так же поддерживаются ‘static foreach’
static foreach(i; iota(10))
{
// используем объявления сгенерированные ранее в 'static foreach'
pragma(msg, "x", i, ": ", mixin(`x` ~ to!string(i)));
static assert(mixin(`x` ~ to!string(i)) == i);
}
void main()
{
import std.conv: text;
import std.typecons: tuple;
import std.algorithm: map;
import std.stdio: writeln;
// у 'static foreach' есть две формы: объявление и инструкция
// (так же как у 'static if').
static foreach(x; iota(3).map!(i => tuple(text("x", i), i)))
{
// создает три локальных переменных x0, x1 и x2
mixin(text(`int `,x[0],` = x[1];`));
scope(exit) // внутри области видимости 'main'
{
writeln(mixin(x[0]));
}
}
writeln(x0," ",x1," ",x2); // результат выполнения
}
Улучшения -betterC
Много улучшений было добавлено к новой опции компилятора dmd -betterC, программы скомпилированные с -betterC не будут ссылаться на неиспользуемые части рантайм, asserts реализованы как C <assert.h> вызовы, а phobos (прим. пер. стандартная библиотека) не слинкована по умолчанию.
Хотите знать больше про Better C? Вам сюда.
Добавлена поддержка AVX2
Компилятор теперь может генерировать инструкции AVX2. Поддержка автоматически распознается с помощью -mcpu=native.
Изменения в стандартной библиотеке
std.base64.Base64URLNoPadding позволяет кодирование/декодирование без смещения
import std.base64 : Base64URLNoPadding;
ubyte[] data = [0x83, 0xd7, 0x30, 0x7b, 0xef];
assert(Base64URLNoPadding.encode(data) == "g9cwe-8");
assert(Base64URLNoPadding.decode("g9cwe-8") == data);
std.digest.digest переименовано в std.digest.
std.meta.Stride добавлен, позволяет выбрать подмножество шаблона по размеру шага и отступу
alias attribs = AliasSeq!(short, int, long, ushort, uint, ulong);
static assert(is(Stride!(3, attribs) == AliasSeq!(short, ushort)));
static assert(is(Stride!(3, attribs[1 .. $]) == AliasSeq!(int, uint)));
Был добавлен Config.detached флаг для spawnProcess, он позволяет запускать новые процессы независимо от текущего процесса. Нет нужды ждать их завершения, ведь они никогда не станут зомби процессами! Попытки вызвать std.process.wait или std.process.kill на обособленом процессе бросит исключение.
Теперь можно использовать std.range.chunks с непрямыми диапазонами, но с ограничениями, налагаемыми этими диапазонами.
import std.algorithm.comparison : equal;
int i;
// генератор не сохраняет состояние, так что он не может быть прямым диапазоном
auto inputRange = generate!(() => ++i).take(10);
// мы все еще можем его обработать по частям, но только за один проход
auto chunked = inputRange.chunks(2);
assert(chunked.front.equal([1, 2]));
assert(chunked.front.empty); // итерация по чанку сьедает его
chunked.popFront;
assert(chunked.front.equal([3, 4]));
Теперь std.socket.UnixAddress поддерживает абстрактные адреса. UNIX сокеты обычно идентифицируются по пути. Linux поддерживает непереносимое расширение этой схемы, известное как абстрактный адрес сокета, которое независимо от файловой системы. Начинается абстрактный адрес с нулевого байта.
auto addr = new UnixAddress("\0/tmp/dbus-OtHLWmCLPR");
Добавлена возможность использовать базовый класс когда производится автоматическая реализация интерфейса. Второй шаблон std.typecons.AutoImplement был добавлен, в отличии от существующего он принимает дополнительный параметр. Этот параметр позволяет уточнить класс от которого наследуемся во время автоматической реализация интерфейса.
>>> Подробности