LINUX.ORG.RU

Релиз D 2.076.0

 ,


1

6

Команда разработчиков 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 был добавлен, в отличии от существующего он принимает дополнительный параметр. Этот параметр позволяет уточнить класс от которого наследуемся во время автоматической реализация интерфейса.

>>> Подробности

★★★★★

Проверено: Shaman007 ()
Последнее исправление: CYB3R (всего исправлений: 11)

Ответ на: комментарий от wolph

Ну а если имена полей в Foo не совпадают с оными в JSON-е? Или вам нужно указать, что number должен быть обязательным, а str — опциональным вот с таким-то дефолтным значением?

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

ага, только выглядит еще более ублюдочно :D

anonymous
()
Ответ на: комментарий от eao197
extern crate serde_json;
#[macro_use] extern crate serde_derive;

#[derive(Deserialize, Debug)]
struct Foo {
    number: Option<i32>,
    #[serde(rename = "str")]
    name: String,
}

fn main() {
    let text = r#"{"number": 12, "str": "hello"}"#;
    let v: Foo = serde_json::from_str(text).unwrap();
    println!("{:?}", v); // Foo { number: Some(12), name: "hello" }
}
RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Э... А как же: «нужно указать, что number должен быть обязательным, а str — опциональным вот с таким-то дефолтным значением?»

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Доу. Я спросонья по-другому прочитал. Вот:

extern crate serde_json;
#[macro_use] extern crate serde_derive;

#[derive(Deserialize, Debug)]
struct Foo {
    number: i32,
    #[serde(default = "default_path")]
    name: String,
}

fn default_path() -> String {
    "/usr".to_owned()
}

fn main() {
    let text = r#"{"number": 12, "name": "/home"}"#;
    let v: Foo = serde_json::from_str(text).unwrap();
    println!("{:?}", v); // Foo { number: 12, name: "/home" }
    
    let text = r#"{"number": 12}"#;
    let v: Foo = serde_json::from_str(text).unwrap();
    println!("{:?}", v); // Foo { number: 12, name: "/usr" }
}

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от NextGenenration

я просто не верю в то что подобные системы сборки облегчают это дело. Они его просто запутывают.

Да это просто разрабы тебя троллят. Специально запутывают свой проект, чтоб ты не понял как он устроен.

anonymous
()
Ответ на: комментарий от RazrFalcon

На плюсах такого и близко нет.

Уж не знаю, насколько по вашему, это далеко, но:

#include <iostream>

#include <json_dto/pub.hpp>

struct Foo {
	int number;
	std::string name;
};

namespace json_dto {

template<typename IO>
void json_io(IO & io, Foo & f) {
	io & mandatory("number", f.number)
		& optional("name", f.name, "/usr");
}

}

std::ostream & operator<<(std::ostream & to, const Foo & f) {
	return (to << f.number << " " << f.name);
}

int main() {
	const auto f1 = json_dto::from_json<Foo>(R"({"number": 12, "name": "/home"})");
	std::cout << f1 << std::endl;

	const auto f2 = json_dto::from_json<Foo>(R"({"number": 12})");
	std::cout << f2 << std::endl;
}
Причем json-сериализация приделана к Foo неинтрузивно. Хотя можно было бы и интрузивно, тогда было бы на несколько строк короче.

eao197 ★★★★★
()
Ответ на: комментарий от wolph

Жаль. Хотя и логично, что в приватные писать не может.

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Да мне самому хотелось бы узнать, потому что в доке я этого не нашел, а увидел на гитхабе в обсуждении. Как минимум чтобы узнать какие еще аттрибуты оно умеет

wolph ★★
()
Ответ на: комментарий от wolph

Ясно. Теперь осталось сделать бенчи, чтобы расставить все точки на i.

Я так понимаю, что D использует статическую рефлексию? Или динамическую?

RazrFalcon ★★★★★
()
Последнее исправление: RazrFalcon (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

Дык вам и в C++ не нужно. Ни RapidJSON, ни json_dto вам писать не нужно, берете готовое, написанное другими людьми так же, как это происходит в Rust, D, Go и других языках.

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

Ну написали, выложили, теперь могут пользоваться кто угодно. Парсинг-то мы не делали, использовали RapidJSON.

Точно так же кто-то написал vibe.d или этот serde для Rust-а.

И это после рассказов о том, что в C++ если либы на все случаи жизни.

Ссылочки на такие рассказы можно? Хотя бы на один?

eao197 ★★★★★
()
Ответ на: комментарий от RazrFalcon

На плюсах такого и близко нет.

На плюсах можно использовать макросы, чтоб описывать структуру в виде:

JSON_OBJECT(data) { FIELD( n1, integer ) FIELD( n2, integer, 1000 ) };

И потом это будет работать в связке с функциями для сериализации/десериализации, только зачем? Обычно такие структуры никому не нужны, нужны полноценные классы, где эти поля будут приватными. Хотя можно и для них выписать логику на макросах, типа:

JSON_OBJECT(data) { JSON_FIELD( n1, get_n1, set_n1 ) JSON_FIELD( n2, get_n2, set_n2 ) ... };

Но ИМХО баловство это все. Выписать два метода не так сложно, кода будет ненамного больше, зато можно будет выписывать логику произвольной сложности, в том числе для обработки ошибок, старых форматов и пр.

anonymous
()
Ответ на: комментарий от anonymous

Блин, забыл тэг для кода добавить.

anonymous
()
Ответ на: комментарий от RazrFalcon

Дальше не читал

От растера такое слышать странно, у вас макросы тоже примитивные. Единственное, что в С++ не хватает рефлексии, хотя предложение ее добавить есть, посмотрим, может что и родят.

anonymous
()
Ответ на: комментарий от RazrFalcon

Ну и таки прочитай дальше, тк. я сильно сомневаюсь, что ты реально так структуры в JSON гоняешь.

anonymous
()
Ответ на: комментарий от RazrFalcon

У меня такое ощущение, что пора вновь завести речь о скудоумии собеседников. Ибо как вот из этого:

Я (лично я) думаю, что непохожесть Rust-а на другие широкораспространенные языки отдаляет тот светлый момент, когда начало нового большого проекта на Rust-е не будет столь рискованным мероприятием, как сейчас. Рискованным по совокупности факторов: наличию большого количества библиотек, наличию специалистов на рынке труда, инструментария (вроде IDE), книг, ресурсов и пр.

может следовать вот это:

И это после рассказов о том, что в C++ если либы на все случаи жизни.

понять у меня не получается.

Так что с первой попыткой привести ссылку вы обосрались. Еще будете пытаться?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Вы предлагаете перечитать все 5к ваших сообщений?

Ваш основной наезд на Rust - это незрелость, ака мало либ. Очевидно, что в противовес C++, у которого с либами, по вашему мнению, всё в порядке. Что я и пытался опровергнуть.

Но вы, как обычно, начитаете брызгать слюной и называть всех идиотами. Надеюсь для этого утверждения мне не придётся искать ссылку?

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Не забывайте про существование Procedural Macros.

Я даже не забыл про плагины к компилятору, хотя там API еще сырое и недоделанное.

anonymous
()
Ответ на: комментарий от RazrFalcon

Вы предлагаете перечитать все 5к ваших сообщений?

Я вам предлагаю отвечать за ваши слова.

Ваш основной наезд на Rust - это незрелость, ака мало либ.

Не только либ.

Очевидно, что в противовес C++

Не очевидно. Нишу С++, в которой пытается обосноваться Rust, пытаются занять и другие языки. Например, Go. Или даже Java, на которой даже реальное время делают. Так что противовесов Rust-у много, C++ лишь один из них.

C++, у которого с либами, по вашему мнению, всё в порядке.

А вот здесь вам требуется доказать, что я высказывал такое мнение. Хоть в форме «в C++ с либами все в порядке», хоть «в C++ есть либы на все случаи жизни».

Что я и пытался опровергнуть.

Пока получается, что вы выдумали за собеседника какое-то утверждение и пытаетесь опровергнуть выдуманное же вами утверждение.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

У С++, кроме прочих, есть одна большая проблема: он не защищает от кривых рук

И горе, если эти кривые руки будут писать ядро/оболочку/систему иницализации... Лично мои кривые руки не принесли кому-то зла, по скольку я особо то ничего и не писал. Но другие, типа небезизвестного Поттеринга, вполне себе пишут. А потом уязвимости находят пачками.

NextGenenration ★★
()
Ответ на: комментарий от khrundel

Чтоб обмануть современный компилятор

Когда-то я собирал генту. Так там предупреждений от компилятора был не один экран. Я уже не помню что это были за предупреждения, но не думаю что там был только мёртвый код.

NextGenenration ★★
()
Ответ на: комментарий от NextGenenration

И горе, если эти кривые руки будут писать ядро/оболочку/систему иницализации...

Вы точно понимаете разницу между C и C++?

eao197 ★★★★★
()
Ответ на: комментарий от BruteForce

Это верно.

Кроме того, если они основаны на подсчёте ссылок, то кто-то криворукий запросто может создать утечку памяти.

NextGenenration ★★
()
Ответ на: комментарий от eao197

Э... А как же: «нужно указать, что number должен быть обязательным, а str — опциональным вот с таким-то дефолтным значением?»

А то что записано number: Some(12) ни о чём не говорит?

NextGenenration ★★
()
Ответ на: комментарий от eao197

Ну мне до вашего уровня лавирования ещё далеко.

Впредь обещаю скрупулёзно записывать все ваши высказывания.

RazrFalcon ★★★★★
()
Ответ на: комментарий от anonymous

Да это просто разрабы тебя троллят. Специально запутывают свой проект, чтоб ты не понял как он устроен.

Эти разрабы не знают о моём существовании

NextGenenration ★★
()
Ответ на: комментарий от NextGenenration

А то что записано number: Some(12) ни о чём не говорит?

Говорит. Но больше говорит о ваших умственных качествах, ибо Some(12) означает, что в каких-то случаях запросто может быть и None. Что противоречит требованию «number должен быть обязательным».

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Ну написали, выложили, теперь могут пользоваться кто угодно

Скорее всего следующий крестовик пойдёт изобретать свой собственный велосипед

NextGenenration ★★
()
Ответ на: комментарий от anonymous

От растера такое слышать странно, у вас макросы тоже примитивные

Там как минимум не просто замена одной строки на другую произвольную строку

NextGenenration ★★
()
Ответ на: комментарий от eao197

Вы точно понимаете разницу между C и C++?

И в чём же заключается ошибочность моих рассуждений? В том что на крестах ядра не пишут? Ну подставь вместо ядре браузер. Что-то принципиально изменилось? И потом, разве си тщательнее проверяет код?

NextGenenration ★★
()
Ответ на: комментарий от eao197

Но больше говорит о ваших умственных качествах

Это я перепутал две переменные? И потом, в качестве примера уже понятно как это будет выглядеть дальше.

NextGenenration ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.