LINUX.ORG.RU

Вышли версии 1.035 и 2.019 языка D

 ,


0

0

Вышла версия 1.035 замечательного языка программирования D. Среди изменений множество исправлений ошибок, добавления конструкторов к структурам в ветке версии 2 и много другое.

>>> Скачать v1 и v2

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



Проверено: Shaman007 ()

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

>Kris Bell (автор, кроме всего прочего, tango.xml) не способен писать медленный код.
>naryl


Корректный код он писать тоже не способен. Так пусть ему.

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

Таки что-нибудь кроме слов будет? Пример некорректного кода? Причина уродливости структур? Или просто потроллить захотелось? Тогда на linuxsuxxx.borda.ru. Там таких любят.

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

> Таки что-нибудь кроме слов будет? Пример некорректного кода? Причина уродливости структур? Или просто потроллить захотелось? Тогда на linuxsuxxx.borda.ru. Там таких любят.

Это другой анонимус, не путай. Структуры обсуждать бесполезно: речь шла про структуры в D1. В D2 добавили конструкторы и деструкторы для них, а в D1 многие используют opCall для инициализации. Получается что-то вроде MyStruct s; s( 1, 2, 3 ); ИМХО, уродство.

Ты вот пользуешься D давно (судя по форумам). Как борешься с неинициализированными объектами? Написать, что-нибудь вроде:

class MyClass
{
MyClass* opAssign( int a )
{
return &this;
}
}

MyClass obj = 3; //.. бабах

или так

MyClass obj = myFunc();

Самое забавное, что совсем недавно myFunc могла быть MyClass myFunc() и сменила тип возвращаемого значения на int в ходе рефакторинга.

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

> Это другой анонимус, не путай.
Прошу прощения. Просто уважаю Kris'а Bell'а.

> Как борешься с неинициализированными объектами?

У меня есть старая (джавистская?) привычка. обьявлять обьекты _только_ так:

auto obj = new MyClass(и т.д.);

и никогда не мешивать ОО и процедурный код. Но мы здесь говорим о языке D. А язык в даном случае ничем не помогает. :(

> MyStruct s; s( 1, 2, 3 );

Принято всё-таки MyStruct s = MyStruct(1, 2, 3);
В D2 с конструктором такая запись тоже сработает, но сработает и MyStruct *s = new MyStruct(1, 2, 3);

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

> MyStruct s; s( 1, 2, 3 ); Принято всё-таки MyStruct s = MyStruct(1, 2, 3);

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

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

> На всякий случай, я проворчал только. Это не холивар :)
Верю. Для холивара слишком обьективные доводы.

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

> Каждый раз при таком присваивании имеем поэлементное копирование.
Вообще-то это не присваивание, а инициализация. Тем более странным становится поведение компилятора на MyClass c = 3;

Без копирования: MyStruct s = { 1, 2, 3 };

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

>> Каждый раз при таком присваивании имеем поэлементное копирование.

>Вообще-то это не присваивание, а инициализация. Тем более странным становится поведение компилятора на MyClass c = 3;

module test1;
import tango.io.Stdout;

struct MyStruct
{
static MyStruct opCall( int v )
{
MyStruct s = { v };
Stdout( &s ).newline;
return s;
}

int v;
}

void main()
{
MyStruct s = MyStruct( 10 );
Stdout( &s ).newline;
}

--------

> test1
12fe60
12fe6c


>Без копирования: MyStruct s = { 1, 2, 3 };

tango.math.BigInt.BigInt i = { { [3, 44, 667, 8] }, false };

:D



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

ой ...йей....

struct BigInt
{
private:
	BigUint data;     // BigInt adds signed arithmetic to BigUint.
	bool sign = false;


private игнорируется O.o

anonymous
()

Ладно, тема давно загнулась, можно и пооффтопить :) У dsss, вроде, нет опции искать dsss.conf в родительских директорях, но при использовании, например, SciTE этой опции сильно не достает. Shell скрипт решает проблему, но не под всеми используемыми ОС :)))

-------------------------------------------------------------

module d;

import std.stdio; import std.path; import std.file;

bool findFileDir( string filename ) { string dirname; do { dirname = std.file.getcwd(); foreach ( string fname; listdir( dirname ) ) { if ( fname == filename ) return true; } std.file.chdir( ".." ); } while( dirname != std.file.getcwd() ); return false; }

int main( string[] args ) { if ( !findFileDir( "dsss.conf" ) ) { writefln( "Error: File 'dsss.conf' was not found" ); return 1; } std.file.system( "dsss build" ); return 0; }

-------------------------------------------------------------

module d2;

import tango.core.Exception; import tango.io.Stdout; import tango.io.FileSystem; import tango.io.FilePath; import tango.io.FileScan; import tango.sys.Process; import tango.sys.Common;

bool findFileDir( char[] filename ) { FilePath dirname = new FilePath( FileSystem.getDirectory() ); while ( true ) { FilePath[] files = dirname.toList( delegate bool ( FilePath file, bool isFolder ) { return ( !isFolder && file.file == filename ); } ); foreach ( file; files ) { if ( file.file == filename ) { FileSystem.setDirectory( dirname.toString() ); return true; } } if ( dirname == dirname.root ) break; dirname = new FilePath( dirname.parent ); } return false; }

int main( char[][] args ) { if ( !findFileDir( "dsss.conf" ) ) { Stdout( "Error: File 'dsss.conf' was not found" ).newline; return 1; } try { auto p = new Process ( "dsss build", null ); p.execute(); Stdout.formatln ( "Output from {}:", p.programName ); Stdout.copy( p.stdout ).flush;

auto result = p.wait(); } catch ( ProcessException e ) { Stdout.formatln( "Process execution failed: {}", e ); return 1; } return 0; }

anonymous
()

Ладно, тема давно загнулась, можно и пооффтопить :) У dsss, вроде, нет опции искать dsss.conf в родительских директорях, но при использовании, например, SciTE этой опции сильно не достает. Shell скрипт решает проблему, но не под всеми используемыми ОС :))) 

-------------------------------------------------------------

module d;

import std.stdio;
import std.path;
import std.file;

bool findFileDir( string filename )
{
    string dirname;
    do 
    {
        dirname = std.file.getcwd();
        foreach ( string fname; listdir( dirname ) )
	{
            if ( fname == filename ) 
                return true;
	}
	std.file.chdir( ".." );
    } 
    while( dirname != std.file.getcwd() );
    return false;
}

int main( string[] args )
{
    if ( !findFileDir( "dsss.conf" ) )
    {
	writefln( "Error: File 'dsss.conf' was not found" );
	return 1;
    }
    std.file.system( "dsss build" );
    return 0;
}

-------------------------------------------------------------

module d2;

import tango.core.Exception;
import tango.io.Stdout;
import tango.io.FileSystem;
import tango.io.FilePath;
import tango.io.FileScan;
import tango.sys.Process;
import tango.sys.Common;

bool findFileDir( char[] filename )
{
    FilePath dirname = new FilePath( FileSystem.getDirectory() );
    while ( true )
    {
	FilePath[] files = dirname.toList( 
	    delegate bool ( FilePath file, bool isFolder )
	    {
		return ( !isFolder && file.file == filename );
	    }
	);
	foreach ( file; files )
	{
	    if ( file.file == filename ) 
	    {
                FileSystem.setDirectory( dirname.toString() );
		return true;
	    }
	}
	if ( dirname == dirname.root )
	    break;
	dirname = new FilePath( dirname.parent );
    } 
    return false;
}

int main( char[][] args )
{
    if ( !findFileDir( "dsss.conf" ) )
    {
	Stdout( "Error: File 'dsss.conf' was not found" ).newline;
	return 1;
    }
    
    try 
    {    
	auto p = new Process ( "dsss build", null );
	p.execute();
	
	Stdout.formatln ( "Output from {}:", p.programName );
	Stdout.copy( p.stdout ).flush;

	auto result = p.wait();
    }
    catch ( ProcessException e )
    {
        Stdout.formatln( "Process execution failed: {}", e );
	return 1;
    }
    
    return 0;
}

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

> module test1;
> и т.д.

ИМХО баг. Компилятор в соответствии со спецификацией должен видеть это как декларация с инициализатором, а он понимает как декларацию и присваивание.

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

>> module test1; >> и т.д. > ИМХО баг. Компилятор в соответствии со спецификацией должен видеть это как декларация с инициализатором, а он понимает как декларацию и присваивание.

Можно ссылку на это место в спецификации? opCall сложно переделать, чтобы значение не копировалось. Конструктор же решает проблему, но, тогда записать MyStruct( 10 ) становится неоднозначаной.

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

> но, тогда записать MyStruct( 10 ) становится неоднозначаной.

If there's any constructor defined for S, then S(args) is a constructor call.

If there's any opCall defined for S, then S(args) is an opCall call.

Otherwise, it's a struct literal.

(c)Walter Bright

Она уже давным давно неоднозначна.

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

> ИМХО баг. Компилятор в соответствии со спецификацией должен видеть это как декларация с инициализатором, а он понимает как декларацию и присваивание.

Сам задумайся как из функции, позволяющей рекурсивные вызовы, вернуть значение, находящееся в стеке, не прибегая к копированию. opCall это есть обычная функция (-член). Это точно не баг.

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

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

Если тебя интересует эффективность, DMD это оптимизирует. Возвращает структуры по ссылке, кога это не меняет семантику.

А про баг извиняюсь. Не подумал.

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

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

> Если тебя интересует эффективность, DMD это оптимизирует. Возвращает структуры по ссылке, кога это не меняет семантику.

Функция не может возвращать ссылок на свои локальные переменные, хранящиеся в стеке, в том числе и структуры. В функцию придется передавать указатель на уже выделенную под структуру память, но это меняет прототип и подходит только для оптимизации.

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