LINUX.ORG.RU

Вышла новая версия компилятора языка D DMD 2.064

 ,


0

4

C момента последнего релиза были проделаны большие работы по улучшению компилятора и самого языка. К основным нововведениям относится улучшенная система импорта модулей и расширение использования ключевого слово new. Множественным улучшениям подверглись шаблоны языка, которые получили не только новый синтаксический сахар, но и возможность неявного указания типа, а также ряд других новых возможностей.

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

Важной вехой в развитии языка стало начало использования его в компании FaceBook.

В настоящий момент идет активное расширение функциональности системной библиотеки Phobos и работа над созданием универсального кросплатформенного графического тулкита D-Quick

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

★★

Проверено: maxcom ()
Последнее исправление: ymn (всего исправлений: 3)
Ответ на: комментарий от loz

Нет, если только новый тип func вдруг случайно не совпал с типом func2.

как на счёт неавных преобразований?

Разве не проще тогда чтобы любая конструкция языка возвращала что-то осмысленное?

будет синтаксический шлак в коде. Придётся вводить специальный тип вроде None (или юзать существующий) и им терминировать каждую void'ную.

Не, вобще-то надо просто посмотреть на последнее выражение функции.

последнее выражение if/case внутри с ещё кучкой if/case'ов

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

Нет, объект самого класса. У него есть dict'оподобный интерфейс. Соответственно, делать с ним можно примерно всё тоже самое.

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

как на счёт неавных преобразований?

Не нужны.

Придётся вводить специальный тип вроде None

Нет, не придется.

последнее выражение if/case внутри с ещё кучкой if/case'ов

Как хорошо что в эрланге такого нет.

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

Кроме того что нельзя просто вызвать функцию, нужно откуда-то получать правильный объект (привет синглетоны).

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

Я хотел показать что многострочные функции бывают удобны независимо от того есть у них имя или нет, функция с именем не связана.

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

в случае с эрлангом - да (да и куда деваться там где функции и сообщения единственные парадигмы языка?). В остальных случаях, неименованные километровые функции запутывают код и усложняют чтение. Потому, лучше именованные функции, и короткие неименованные функции, выполняющие алгоритм в пределе одной строки. Так просто и понятно. Просто писать, понятно читать. Мне кажется это настолько очевидным, что надеюсь просто что ты меня траллишь. Иначе это грустно.

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

Так толсто...

... что даже и тонко.

Ты покажи что это входит в стандарт языка, а не фичу конкретного компилятора.

Ну, во-первых, в Linux gcc вполне стандартен (не со шлангом же, ей Богу «развлекаться»). Во-вторых, если говорить о питоне и пытаться сравнивать стандарты C со стандартами питона то их, простите нет у питона. Сравнивать не с чем. Просто не с чем. И, наконец, в третьих, обсуждаемые нами nested functions в gcc появились, ЕМНИП, в году 2007-08. Время на закрепление в стандарте примерно известно — порядка 10 лет. Так что, скорее всего, увидим, но чуть позже.

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

Я же написал, что на данный момент такие выражения не компилируются, но если делать return опциональным они должны работать.

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

И непонятно какое выражение считать последним в случае

void f1(int x) { /* много кода */ }

int f(int x) 
{
  x+1;
  f1(x);
}
Разумеется, можно ввести правила, которые будут решать подобные ситуации, но, ИМХО, только для того чтобы сделать return опциональным это нецелесообразно

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

Потом её немного рефакторят, делают ф-ю с возвращаемым значением забывая дописать конец.

Получается валидная с точки зрения языка ф-я и UB с точки зрения логики

И при этом тип совпал? Ну, если уж придумывать сценарии ошибки, то пусть будет такой: при рефакторинге просто дописали return перед последним оператором.

Смотрит он на реализацию type func() и аналогичные ф-ии, нигде не ясно забыли ли вернуть осмысленное значение или нет.

У нас априори язык, в котором возвращается последнее вычисленное значение, так что вопрос «забыли или нет» не стоит.

Почему-то на эрланге работают высоконагруженные кластеры и никто не жалуется.

на PHP тоже

Это ты не мне отвечаешь.

нужно рассказать что такое неявное приведение типов, copy constructor и про прочие прелести ООП-подобных ЯП?

Нет, не надо. Это Си++-проблемы, но в Си++ никто и не собирается добавлять обсуждаемую возможность.

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

В чем проблема с этим подходом?

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

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

В чем проблема с этим подходом?

Проблема в том что он негодный.

Веско, убедительно.

Код не должен превращаться в ребус.

Не превращай.

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

Ох уж эти рационализаторы. поубивал бы всех нах!

Тебе слабо.

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

Сорри, t маленькая. т.е. Qt - is a cross-platform application and UI framework

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

А как можно считать последним x+1, если оно не последнее? Например, так это работает в руби:

$ cat > 1.rb <<EOF
def foo
  1
end

def bar
  2 + 2
  foo + 5
end

puts bar
EOF

$ ruby 1.rb
6

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

Компилятор допускает конструкции вида

int f1(T)(T x) { return x; }
void f1(byte x) { }
Разумеется это говнокод, но при раскрытии шаблонов что то подобное вполне может получится. Для читающего ребус ещё тот

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

Я не знаю ruby. В нем функция может не возвращать значение?

at ★★
()
Ответ на: Так толсто... от anonymous

со стандартами питона то их, простите нет у питона.

И это еще одна причина почему питон говно.

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

Это понятно, просто непонятно зачем писать такой код, про который заведомо известно что он не будет выполнятся. Это все равно что писать if (0) { ... }.

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

Допустим есть функция

int foo(int x) { return x+1; }
Если делать return опциональным у нас получится
int foo(int x) { x+1; } 

at ★★
()

Хм. Чем оно лучше Си?

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

Или вот ещё

int foo(int x) {
    for (int i=0; i<10; i++)
        x += i;
}
Результат какого выражения должен возвращаться. У i<10 тип bool, но он может быть приведен к int.

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

Результат for, естественно. А он будет равен результату последнего выражения в теле цикла на последней итерации.

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

Результат какого выражения должен возвращаться.

Ответ на этот вопрос зависит от того, какой тип имеет конструкция for. Было бы естественным, что это void (или unit), и тогда программа ошибочна, компилятор должен ее отвергать.

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

Согласен, естественнее было бы void. Если же посмотреть на хаскель, там был бы список из результатов каждой итерации.

unC0Rr ★★★★★
()

Я уже нашел замену С++, действительно классную - Mozilla Rust. Вот если бы плюсы были такие, то софт действительно был бы лучше

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

То есть нужно, чтобы все инструкции возвращали значения, какое то соглашение когда функция должна возвращать структуру, инстанс, делегат и т.д. Возможно что то ещё.

ИМХО делать это только для того, чтобы иметь возможность иногда не писать return неправильно.

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

То есть нужно, чтобы все инструкции возвращали значения, какое то соглашение когда функция должна возвращать структуру, инстанс, делегат и т.д.

То есть каждая конструкция языка должна вырабатывать какое-то значение.

ИМХО делать это только для того, чтобы иметь возможность иногда не писать return неправильно.

Оно делается для усиления выразительности вообще. Возможность не писать return - только один из профитов.

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

Mozilla Rust. Вот если бы плюсы были такие

Си++ не мог быть таким. Судя по дискуссиям в девелоперском списке Rust, даже его создатели не во всех своих решениях уверены, и по ходу разработки возникают неожиданные задачи.

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

Хаскеля я, к сожалению, не знаю, но если создавать новый язык, с учетом этого тогда проблем не будет (или просто использовать язык, где такая возможность есть). Если же попытаться добавить такую возможность в существующий язык то получим трехгорбого верблюда на костылях.

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

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

А какие ещё профиты можно получить? Мне в голову приходит только возможность убрать return вообще. Чтобы у функции была только одна точка возврата.

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

Нативный байндинг к libc regex. С его помощью допишу аналог комманды sort. Потом буду писать небольшой сервачек

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

Альфа такая что прямо дымится. Версия 0.8. До 1.0 разработчики оставляют за собой право как угодно ломать библиотеки и менять синтаксис языка.

С каждым релизом дохнут все библиотеки и фреймворки. Их уже перестали писать, ждут 1.0

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

Альфа такая что прямо дымится.

Сырой альфой были первые версии Rust, когда у руля был Хоар; сырой бетой Rust был перед его уходом; сейчас уже упорно говорят о 1.0, при этом окончательного консенсуса о фичах еще нет. Так что в результате они либо упустят время и говноGo всё зохавает, либо они выпустят незавершенный язык.

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

говноGo

ГовноGo зохавает не все, а нишу замены С++. Ну как бы нишу не С++, а именно нишу замены C++, если ты понимаешь о чем я ;)

И именно потому что Google > Mozilla и Go готов сейчас. Будь Rust хоть во всем круче.

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

А чем в таком случае...

... лучше эрланг? Из языка, изначально предназначенного для решения специфичных для «телекома» задач, его тянут куда ни попадя. Получится как с перлом — из языка обработки логов, его затянули куда ни попадя и потом похоронили (в основной массе для индустрии он скорее мёртв чем жив).

В то же время, С как жил, так и живёт. /* С в другом неповезло — похожий на С синтаксис был использован для семантически отличного от С языка. И это даёт повод упоротышам с разных сайтов писать «почему D лучше С++», но при этом у них не включаются мозги чтобы не писать «С/С++». Что там за D они изволят напейсать, мне неведомо. Меня скорее интересует вопрос насколько сильно их контузило. При таких «подходах». */

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

А какие ещё профиты можно получить?

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

 let mut response = match request.read_response() {
        Ok(r) => r,
        Err(_) => {
            start_sending(start_chan, Metadata::default(url)).send(Done(Err(())));
            return;
        }
    };

Мне в голову приходит только возможность убрать return вообще. Чтобы у функции была только одна точка возврата.

Это просто побочный эффект, тем более, что return не обязательно убирать из языка. В Rust он есть, например.

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