Re: Jonathan Blow demo #2

2014-12-22 Thread Andrei Alexandrescu via Digitalmars-d

On 12/12/14 2:47 AM, bearophile wrote:



OK, I think that it will be enough to add a Phobos function like this
(what's the right Phobos module to put it?) (why isn't this @trusted?)
(why isn't this returning a T*?):



ref T uninitializedAlloc(T)() @system pure nothrow
{
   return *cast(T*)GC.malloc(T.sizeof);
}


https://issues.dlang.org/show_bug.cgi?id=13859

Bye,
bearophile


There should be a minimallyInitializedAlloc, too. -- Andrei


Re: Jonathan Blow demo #2

2014-12-12 Thread bearophile via Digitalmars-d

Walter Bright:


On 12/11/2014 1:49 PM, bearophile wrote:

Walter Bright:


struct Vec { float x = 1, y = 5, z = 9; }

auto v = new Vec(void);
auto av = new Vec[10] = void;
auto av2 = new Vec[10] = Vec(0, 0, 0);


D already does this.


D doesn't do that, not even one of those three :-)


I beg to differ:


struct Vec { float x = 1, y = 5, z = 9; }

void main()
{
  {
Vec v;
assert(v.x == 1  v.y == 5  v.z == 9);
  }


This is not relevant in this discussion.



  {
auto v = new Vec();
assert(v.x == 1  v.y == 5  v.z == 9);
  }


This misses the point.

This code:
struct Vec { float x = 1, y = 5, z = 9; }
auto v = new Vec(void);

Means having defined a struct with explicitly statically defined 
fields, and then allocate one of it on the heap without 
initializing its fields.

It's equivalent to:

auto v = cast(Vec*)malloc(Vec.sizeof);

Also written like this if you have written a little function 
(missing in Phobos) that makes your code more DRY and hides the 
cast in a probably @trusted function:


auto v = cMalloc!Vec;

Similar code can be written if you want to use the GC heap.



  {
auto v = cast(Vec*)malloc(Vec.sizeof * 10)[0..10];
  }


This is right, but in D it's often better to use 
std.array.uninitializedArray to do that.




  {
auto v = new Vec[10];
v[] = Vec(0,0,0);
assert(v[1].x == 0  v[1].y == 0  v[1].z == 0);
  }
}


This causes double initialization of the array, and I can't be 
sure the optimizer removes the first one (dmd doesn't remove it, 
and until now ldc2 doesn't remove it).


To solve this problem with Phobos code it can be added another 
std.array function like:


auto av2 = initializedArray!(Vec[])(10, Vec(0, 0, 0));

Beside constants, initializedArray also should accept a pure 
function that takes as input the index (this request is in 
Bugzilla).


So all three patterns can be realized using functions, so there's 
no need to change the D language to do all three things.


But are some of those patterns common enough to deserve to be 
supported by the language?


Bye,
bearophile


Re: Jonathan Blow demo #2

2014-12-12 Thread bearophile via Digitalmars-d

Walter Bright:


I don't see support for the notion of a ushort index.


A ushort index is not useful, I agree. That's why I have said my 
proposal is a little different from Jonathan Blow idea.


My point was to optionally define built-in arrays with a strongly 
typed indexing (where the strongly typed index can be defined 
with a better version of Typedef!()), as I've tried to explain in 
that post.


If you have questions please ask and I'll try to explain again 
(at worst Monday).


Bye,
bearophile


Re: Jonathan Blow demo #2

2014-12-12 Thread Martin Nowak via Digitalmars-d

On 12/12/2014 10:54 AM, bearophile wrote:

This code:
struct Vec { float x = 1, y = 5, z = 9; }
auto v = new Vec(void);

Means having defined a struct with explicitly statically defined fields,
and then allocate one of it on the heap without initializing its fields.
It's equivalent to:

auto v = cast(Vec*)malloc(Vec.sizeof);


D is a language with C-like syntax and static typing. It pragmatically 
combines efficiency, control, and modeling power, with ~~~safety~~ and 
programmer productivity.


Unsafe stuff shouldn't be simple to type and why would you need language 
support for a 1-liner?


ref T uninitializedAlloc(T)() @system pure nothrow
{
return *cast(T*)GC.malloc(T.sizeof);
}

The only argument I can see is the asymmetry to
Vec v = void;




Re: Jonathan Blow demo #2

2014-12-12 Thread bearophile via Digitalmars-d

Martin Nowak:

OK, I think that it will be enough to add a Phobos function like 
this (what's the right Phobos module to put it?) (why isn't this 
@trusted?) (why isn't this returning a T*?):




ref T uninitializedAlloc(T)() @system pure nothrow
{
return *cast(T*)GC.malloc(T.sizeof);
}



Plus these one of two Phobos functions:
https://d.puremagic.com/issues/show_bug.cgi?id=8280

(But the request about optionally strongly typed array indexes is 
still active).


Bye,
bearophile


Re: Jonathan Blow demo #2

2014-12-12 Thread bearophile via Digitalmars-d


OK, I think that it will be enough to add a Phobos function 
like this (what's the right Phobos module to put it?) (why 
isn't this @trusted?) (why isn't this returning a T*?):




ref T uninitializedAlloc(T)() @system pure nothrow
{
   return *cast(T*)GC.malloc(T.sizeof);
}


https://issues.dlang.org/show_bug.cgi?id=13859

Bye,
bearophile


Re: Jonathan Blow demo #2

2014-12-12 Thread Martin Nowak via Digitalmars-d

On 12/12/2014 11:42 AM, bearophile wrote:

Martin Nowak:

OK, I think that it will be enough to add a Phobos function like this
(what's the right Phobos module to put it?)


Did you just volunteer to make a pull :)?
As usual, having a problem to find the right place myself.
Would put it close to uninitializedFill which lives in std.algorithm, yuck.
BTW, if anyone knows where initOnce should go, I'd be glad to hear.
https://github.com/D-Programming-Language/phobos/pull/2664#issuecomment-66242464


(why isn't this @trusted?)


Can't be trusted because it returns a heap allocated struct that might 
contain uninitialized pointers. You could be more precise and make an 
overload for plain value types.



(why isn't this returning a T*?):



ref T uninitializedAlloc(T)() @system pure nothrow
{
return *cast(T*)GC.malloc(T.sizeof);
}


Yeah, that should return a pointer.



Re: Jonathan Blow demo #2

2014-12-12 Thread Martin Nowak via Digitalmars-d

On 12/11/2014 10:34 PM, Walter Bright wrote:


D already does this. It's been said before, Jonathan is reinventing D,
piece by piece :-)


What does that mean, it's been said?
Didn't anyone actually try to tell him about D?



Re: Jonathan Blow demo #2

2014-12-12 Thread Tobias Pankrath via Digitalmars-d

On Friday, 12 December 2014 at 11:58:04 UTC, Martin Nowak wrote:

On 12/11/2014 10:34 PM, Walter Bright wrote:


D already does this. It's been said before, Jonathan is 
reinventing D,

piece by piece :-)


What does that mean, it's been said?
Didn't anyone actually try to tell him about D?


Actually he dismisses D in his first video for being too much
like C++.



Re: Jonathan Blow demo #2

2014-12-12 Thread Chris via Digitalmars-d

On Thursday, 11 December 2014 at 16:57:35 UTC, bearophile wrote:

Jonathan Blow, Programming Language Demo #2:

https://www.youtube.com/watch?v=-UPFH0eWHEI

https://www.reddit.com/r/programming/comments/2oyg5e/jonathan_blow_dec_10_programming_language_demo_2/

--

He shows a way to not initialize a struct that has specified 
values. In D it could be:


struct Vec { float x = 1, y = 5, z = 9; }

auto v = new Vec(void);
auto av = new Vec[10] = void;
auto av2 = new Vec[10] = Vec(0, 0, 0);

--

He suggests a way to optionally specify the type of array 
indexes. In a D-like syntax it could be:


enum N = 10;
float[N : ushort] a1;
float[: ushort] a2;

My point of having this in D is to optionally increase 
strictness of the array indexes, to avoid some bugs when you 
handle many arrays.


--

He suggests something like a @noinline attribute.

Bye,
bearophile


It would be nice, if you gave a real world example and explained 
why you need this feature and whether the problem is general 
enough to turn it into a feature of the language.


I sometimes think Wouldn't it be nice to have feature X now! 
only to find out it is already there. This, or I realize the code 
is flawed somewhere else and I can sort it out by fixing the 
flawed code.


I'm sometimes tempted to demand a feature, but then I realize 
that the problem is so specific that it would be ridiculous to 
demand a language feature for a problem that is specific only to 
my problem. It reminds me of laws. At the beginning laws cover 
general cases (theft, fraud whatever), then people demand a 
specific law for theft after 5 o'clock in winter when the moon is 
full as opposed to theft in summer when the sky is blue. And 
there was this guy who got robbed in autumn ...


Re: Jonathan Blow demo #2

2014-12-12 Thread Martin Nowak via Digitalmars-d

On 12/12/2014 01:15 PM, Tobias Pankrath wrote:

Actually he dismisses D in his first video for being too much
like C++.


What do you usually do when learning a new programming language?
Right, write a small program. Apparently he ruled out all 3 candidates 
by looking at the front page of their website, so clearly this guy wants 
to write his own personal perfect programming language, be it for fun 
or for fame.
I think every good C++ programmer ends up in this situation at some 
point and using an existing language will always feel like a compromise.

And who wouldn't have thought of writing a better D ;).

Anyhow, he seems to be a somewhat smart guy and we could really make use 
of one that has enough time to write a compiler. Maybe we could talk him 
into giving D a more in-depth look. He might have missed the pragmatic 
in It pragmatically combines efficiency, control, and modeling power, 
with safety and programmer productivity..

https://www.youtube.com/watch?v=TH9VCN6UkyQ#t=1626
But to understand how much more productive D is in comparison to C++, 
he'd have to actually code something.


-Martin


Re: Jonathan Blow demo #2

2014-12-12 Thread Joakim via Digitalmars-d

On Friday, 12 December 2014 at 11:58:04 UTC, Martin Nowak wrote:

On 12/11/2014 10:34 PM, Walter Bright wrote:


D already does this. It's been said before, Jonathan is 
reinventing D,

piece by piece :-)


What does that mean, it's been said?


He means he said it before: :)

http://forum.dlang.org/post/m33eun$1ki4$1...@digitalmars.com


Re: Jonathan Blow demo #2

2014-12-12 Thread ponce via Digitalmars-d

On Friday, 12 December 2014 at 11:58:04 UTC, Martin Nowak wrote:

On 12/11/2014 10:34 PM, Walter Bright wrote:


D already does this. It's been said before, Jonathan is 
reinventing D,

piece by piece :-)


What does that mean, it's been said?
Didn't anyone actually try to tell him about D?


I did in a quite long e-mail. Here is his answer:

I agree that D is a much better language than C++ but I don't 
believe it is quite the right thing. I am going to keep doing 
talks, and the further talks will go into more language 
specifics, and I think you'll see that eventually it shapes up 
into a pretty different language.


That said, I do think D has a lot of value, and if the world 
switched over to D from C++ tonight, I think everyone would be 
a lot better off.


I am well aware of how much work it is to make a new language 
and get it adopted. It is a big job for sure! But, part of my 
goal is to rally the big game development community to do that 
big job.


I feel like he is a very capable programmer that simply want to 
do his thing, like many of us do :)


Re: Jonathan Blow demo #2

2014-12-12 Thread Walter Bright via Digitalmars-d

On 12/12/2014 1:58 AM, bearophile wrote:

My point was to optionally define built-in arrays with a strongly typed indexing
(where the strongly typed index can be defined with a better version of
Typedef!()), as I've tried to explain in that post.


All you have to do is define your own array type as a struct wrapper around an 
array, then overload the [] operator. No need for new language features.




Re: Jonathan Blow demo #2

2014-12-12 Thread Walter Bright via Digitalmars-d

On 12/12/2014 3:57 AM, Martin Nowak wrote:

On 12/11/2014 10:34 PM, Walter Bright wrote:


D already does this. It's been said before, Jonathan is reinventing D,
piece by piece :-)


What does that mean, it's been said?
Didn't anyone actually try to tell him about D?



I've emailed him about it. He is having a great time designing his own language, 
though, and of course I can understand that :-)


Jonathan Blow demo #2

2014-12-11 Thread bearophile via Digitalmars-d

Jonathan Blow, Programming Language Demo #2:

https://www.youtube.com/watch?v=-UPFH0eWHEI

https://www.reddit.com/r/programming/comments/2oyg5e/jonathan_blow_dec_10_programming_language_demo_2/

--

He shows a way to not initialize a struct that has specified 
values. In D it could be:


struct Vec { float x = 1, y = 5, z = 9; }

auto v = new Vec(void);
auto av = new Vec[10] = void;
auto av2 = new Vec[10] = Vec(0, 0, 0);

--

He suggests a way to optionally specify the type of array 
indexes. In a D-like syntax it could be:


enum N = 10;
float[N : ushort] a1;
float[: ushort] a2;

My point of having this in D is to optionally increase strictness 
of the array indexes, to avoid some bugs when you handle many 
arrays.


--

He suggests something like a @noinline attribute.

Bye,
bearophile


Re: Jonathan Blow demo #2

2014-12-11 Thread Walter Bright via Digitalmars-d

On 12/11/2014 8:57 AM, bearophile wrote:

He shows a way to not initialize a struct that has specified values. In D it
could be:

struct Vec { float x = 1, y = 5, z = 9; }

auto v = new Vec(void);
auto av = new Vec[10] = void;
auto av2 = new Vec[10] = Vec(0, 0, 0);


D already does this. It's been said before, Jonathan is reinventing D, piece by 
piece :-)




He suggests a way to optionally specify the type of array indexes. In a D-like
syntax it could be:

enum N = 10;
float[N : ushort] a1;
float[: ushort] a2;


I don't see any point to this.



My point of having this in D is to optionally increase strictness of the array
indexes, to avoid some bugs when you handle many arrays.


Doesn't make sense to me.



He suggests something like a @noinline attribute.


It'll go into D in some form. It's an old suggestion.



Re: Jonathan Blow demo #2

2014-12-11 Thread bearophile via Digitalmars-d

Walter Bright:


struct Vec { float x = 1, y = 5, z = 9; }

auto v = new Vec(void);
auto av = new Vec[10] = void;
auto av2 = new Vec[10] = Vec(0, 0, 0);


D already does this.


D doesn't do that, not even one of those three :-) I'm willing to 
open one or two ERs later on those things.


At best in Phobos we have a workaround for the second of those 
three ideas:


auto av = minimallyInitializedArray(Vec, 10);


He suggests a way to optionally specify the type of array 
indexes. In a D-like

syntax it could be:

enum N = 10;
float[N : ushort] a1;
float[: ushort] a2;


I don't see any point to this.


My point of having this in D is to optionally increase 
strictness of the array

indexes, to avoid some bugs when you handle many arrays.


Doesn't make sense to me.


I explained the topic here (note this not exactly the same thing 
discussed by Jonathan Blow:

http://forum.dlang.org/thread/qilkslpfwvkbqlrad...@forum.dlang.org

Bye,
bearophile


Re: Jonathan Blow demo #2

2014-12-11 Thread bearophile via Digitalmars-d

Walter Bright:


struct Vec { float x = 1, y = 5, z = 9; }

auto v = new Vec(void);
auto av = new Vec[10] = void;
auto av2 = new Vec[10] = Vec(0, 0, 0);


D already does this.


D doesn't do that, not even one of those three :-) I'm willing to
open one or two ERs later on those things.

At best in Phobos we have a workaround for the second of those
three ideas:

auto av = minimallyInitializedArray(Vec, 10);


He suggests a way to optionally specify the type of array 
indexes. In a D-like

syntax it could be:

enum N = 10;
float[N : ushort] a1;
float[: ushort] a2;


I don't see any point to this.


My point of having this in D is to optionally increase 
strictness of the array

indexes, to avoid some bugs when you handle many arrays.


Doesn't make sense to me.


I explained the topic here (note this not exactly the same thing
discussed by Jonathan Blow:
http://forum.dlang.org/thread/qilkslpfwvkbqlrad...@forum.dlang.org

Bye,
bearophile


Re: Jonathan Blow demo #2

2014-12-11 Thread Walter Bright via Digitalmars-d

On 12/11/2014 1:49 PM, bearophile wrote:

He suggests a way to optionally specify the type of array indexes. In a D-like
syntax it could be:

enum N = 10;
float[N : ushort] a1;
float[: ushort] a2;


I don't see any point to this.



My point of having this in D is to optionally increase strictness of the array
indexes, to avoid some bugs when you handle many arrays.


Doesn't make sense to me.


I explained the topic here (note this not exactly the same thing
discussed by Jonathan Blow:
http://forum.dlang.org/thread/qilkslpfwvkbqlrad...@forum.dlang.org


I don't see support for the notion of a ushort index.



Re: Jonathan Blow demo #2

2014-12-11 Thread Walter Bright via Digitalmars-d

On 12/11/2014 1:49 PM, bearophile wrote:

Walter Bright:


struct Vec { float x = 1, y = 5, z = 9; }

auto v = new Vec(void);
auto av = new Vec[10] = void;
auto av2 = new Vec[10] = Vec(0, 0, 0);


D already does this.


D doesn't do that, not even one of those three :-)


I beg to differ:


struct Vec { float x = 1, y = 5, z = 9; }

void main()
{
  {
Vec v;
assert(v.x == 1  v.y == 5  v.z == 9);
  }
  {
auto v = new Vec();
assert(v.x == 1  v.y == 5  v.z == 9);
  }
  {
auto v = cast(Vec*)malloc(Vec.sizeof * 10)[0..10];
  }
  {
auto v = new Vec[10];
v[] = Vec(0,0,0);
assert(v[1].x == 0  v[1].y == 0  v[1].z == 0);
  }
}