Re: DIP58: .. as a Binary Operator

2014-03-18 Thread Rainer Schuetze



On 17.03.2014 23:33, Robert Schadek wrote:

On 03/17/2014 11:24 PM, H. S. Teoh wrote:

On Mon, Mar 17, 2014 at 11:16:12PM +0100, Robert Schadek wrote:

replace .. with : to make lexing easier, please

auto b = arr[(someCondition) ? w:x : y:z];

:-(


T


Thats a parsing problem.

1..1 makes you think you got a prefix of a float 1. but actually you got
an int slice_operator int. If there where no .. flex like generator
could handle D, at least as far as I can see it.



.. is a tiny problem regarding lexing in comparison to all the string 
types in D. How do you deal with DelimitedString and TokenString 
(http://dlang.org/lex#DelimitedString) when using a lexer generator?


Re: DIP58: .. as a Binary Operator

2014-03-18 Thread Ola Fosheim Grøstad

On Monday, 17 March 2014 at 23:03:14 UTC, Robert Schadek wrote:

On 03/17/2014 11:43 PM, Timon Gehr wrote:

No, it does not. The lexer does not need to change.
you're right, but at some distant  future I would like .. to be 
replaced by :


Yes. I also like the .. notation in Dart where you keep holding 
onto a reference:


return new X() ..setSomething(1) ..answer=42 ..name=Somebody;

It is very handy sugar when dealing with DOMs.


DIP58: .. as a Binary Operator

2014-03-17 Thread Mason McGill
I just wrote a DIP aimed at improving slicing and range 
construction syntax while maintaining backwards compatibility, 
and I'd like to hear your opinions!

http://wiki.dlang.org/DIP58

It can be thought of as an elaboration on the approach discussed 
here:

http://forum.dlang.org/thread/mailman.551.1365290408.4724.digitalmars-d-le...@puremagic.com

And an alternative to the approach discussed here:
http://forum.dlang.org/thread/upzdamhmxrrlsexgc...@forum.dlang.org#post-ncwqaixkgbgycybvpkgj:40forum.dlang.org

I think the issue of appealing to numerical programmers is worth 
some attention because there's a distinct niche that D is 
frustratingly close to filling.  In my field, researchers will 
often write scripts in a dynamic language, publish, iterate, and 
eventually re-write their software in C++ and release it as a 
library.  The re-writing step is a large time investment, but 
it's important because


  - Dynamic languages are either slow (MATLAB/Python/R) or 
immature (Julia).
  - Other researchers may prefer another dynamic language, but 
every relevant dynamic language can interface with native 
libraries.


D already has the speed and modeling power of C++, GC for clean 
API design, and reflection for automatic bindings, but it's 
missing a few key features required to make something like NumPy 
or the Julia standard library possible in D.  I believe DIP58 
provides those features, and accepting DIP58 will make D a 
competitive alternative to the prototype/test/rewrite/release 
cycle.


On another note, I'm pretty new to D and the community, so let me 
know if there's any protocol I should follow with respect to DIPs 
and I'll get on it!


Cheers,
Mason


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread bearophile

Mason McGill:


http://wiki.dlang.org/DIP58


Seems nice. But the syntax a..b..step is not very nice.

Bye,
bearophile


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Mason McGill

On Monday, 17 March 2014 at 17:41:16 UTC, bearophile wrote:

Mason McGill:


http://wiki.dlang.org/DIP58


Seems nice.


Thanks.  There are a few awkward parts to maintain compatibility, 
but that seems to be the only way to go.



But the syntax a..b..step is not very nice.


Do you not like the order?  Because it was actually a..step..b 
(like MATLAB/Julia, not like Python).  Or do you not like the 
verbosity of all those dots (a:step:b would be better)?  Or is 
it the readability issues if floating point literals were mixed 
in there?




Bye,
bearophile




Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Chris Williams

On Monday, 17 March 2014 at 19:07:45 UTC, Mason McGill wrote:

On Monday, 17 March 2014 at 17:41:16 UTC, bearophile wrote:

Mason McGill:


http://wiki.dlang.org/DIP58


Seems nice.


Thanks.  There are a few awkward parts to maintain 
compatibility, but that seems to be the only way to go.



But the syntax a..b..step is not very nice.


Do you not like the order?  Because it was actually a..step..b 
(like MATLAB/Julia, not like Python).  Or do you not like the 
verbosity of all those dots (a:step:b would be better)?  Or 
is it the readability issues if floating point literals were 
mixed in there?




Bye,
bearophile


Random thought, but treating step as a template argument would 
allow for some more interesting changes to the iterations, though 
I can't think of any particular syntax that would look good. And 
if you did add such a thing, then other operators would want it 
as well.


int[] foo = a ..!a += 10 b;
bool equals = dbl1 ==.abs(a - b)  0.01 dbl2


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread H. S. Teoh
On Mon, Mar 17, 2014 at 07:07:44PM +, Mason McGill wrote:
 On Monday, 17 March 2014 at 17:41:16 UTC, bearophile wrote:
 Mason McGill:
 
 http://wiki.dlang.org/DIP58
 
 Seems nice.
 
 Thanks.  There are a few awkward parts to maintain compatibility,
 but that seems to be the only way to go.
 
 But the syntax a..b..step is not very nice.
 
 Do you not like the order?  Because it was actually a..step..b (like
 MATLAB/Julia, not like Python).  Or do you not like the verbosity
 of all those dots (a:step:b would be better)?  Or is it the
 readability issues if floating point literals were mixed in there?
[...]

Not speaking for bearophile here, but I don't like using .. to mean two
different things (endpoints vs. step).


T

-- 
Study gravitation, it's a field with a lot of potential.


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Mason McGill
Random thought, but treating step as a template argument would 
allow for some more interesting changes to the iterations, 
though I can't think of any particular syntax that would look 
good. And if you did add such a thing, then other operators 
would want it as well.


Interesting, though I feel like operator syntax really shines 
when either
  1) It's significantly shorter/simpler than the equivalent 
function calls.

  2) It appeals to domain-specific intuitions.

In terms of (1) and (2), I think better spellings for these might 
be



int[] foo = a ..!a += 10 b;


import std.array: array;
import std.range: iota;

int[] foo = array(iota(a, b, 10));
// Or something with recurrence, in the general case.


bool equals = dbl1 ==.abs(a - b)  0.01 dbl2


import std.math: abs;

struct Approximation(A)
{
A a;
alias a this;

bool opEquals(B)(B b) const
  { return abs(a - b)  0.01; }
}

auto approximate(A)(A a)
  { return Approximation!A(a); }

bool equals = approximate(a) == b;


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Asman01

On Monday, 17 March 2014 at 07:56:20 UTC, Mason McGill wrote:
I just wrote a DIP aimed at improving slicing and range 
construction syntax while maintaining backwards compatibility, 
and I'd like to hear your opinions!

http://wiki.dlang.org/DIP58

It can be thought of as an elaboration on the approach 
discussed here:

http://forum.dlang.org/thread/mailman.551.1365290408.4724.digitalmars-d-le...@puremagic.com

And an alternative to the approach discussed here:
http://forum.dlang.org/thread/upzdamhmxrrlsexgc...@forum.dlang.org#post-ncwqaixkgbgycybvpkgj:40forum.dlang.org

I think the issue of appealing to numerical programmers is 
worth some attention because there's a distinct niche that D is 
frustratingly close to filling.  In my field, researchers will 
often write scripts in a dynamic language, publish, iterate, 
and eventually re-write their software in C++ and release it as 
a library.  The re-writing step is a large time investment, but 
it's important because


  - Dynamic languages are either slow (MATLAB/Python/R) or 
immature (Julia).
  - Other researchers may prefer another dynamic language, but 
every relevant dynamic language can interface with native 
libraries.


D already has the speed and modeling power of C++, GC for clean 
API design, and reflection for automatic bindings, but it's 
missing a few key features required to make something like 
NumPy or the Julia standard library possible in D.  I believe 
DIP58 provides those features, and accepting DIP58 will make D 
a competitive alternative to the prototype/test/rewrite/release 
cycle.


On another note, I'm pretty new to D and the community, so let 
me know if there's any protocol I should follow with respect to 
DIPs and I'll get on it!


Cheers,
Mason


Looks like Pascal stuff to me...



Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Mason McGill

On Monday, 17 March 2014 at 19:58:40 UTC, H. S. Teoh wrote:

On Mon, Mar 17, 2014 at 07:07:44PM +, Mason McGill wrote:

On Monday, 17 March 2014 at 17:41:16 UTC, bearophile wrote:
Mason McGill:

http://wiki.dlang.org/DIP58

Seems nice.

Thanks.  There are a few awkward parts to maintain 
compatibility,

but that seems to be the only way to go.

But the syntax a..b..step is not very nice.

Do you not like the order?  Because it was actually a..step..b 
(like
MATLAB/Julia, not like Python).  Or do you not like the 
verbosity

of all those dots (a:step:b would be better)?  Or is it the
readability issues if floating point literals were mixed in 
there?

[...]

Not speaking for bearophile here, but I don't like using .. to 
mean two

different things (endpoints vs. step).


That's fair.  The rationale was the precedent set by MATLAB, 
Python, and Julia.  One of the benefits of making (a..b) an 
expression is the ability to define functions that operate on the 
result.


Examples:
-
stride(a..b, 2);
(a..b).by(2);// I happen to like this spelling.

(a..b).reverse;

(a..b).square; // To define a 2D grid.

(a..b).window(c); // c-length windows of a..b.
  // Useful for indexing video frames
  // in a multi-frame analysis.



Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Meta

On Monday, 17 March 2014 at 07:56:20 UTC, Mason McGill wrote:
I just wrote a DIP aimed at improving slicing and range 
construction syntax while maintaining backwards compatibility, 
and I'd like to hear your opinions!

http://wiki.dlang.org/DIP58

It can be thought of as an elaboration on the approach 
discussed here:

http://forum.dlang.org/thread/mailman.551.1365290408.4724.digitalmars-d-le...@puremagic.com

And an alternative to the approach discussed here:
http://forum.dlang.org/thread/upzdamhmxrrlsexgc...@forum.dlang.org#post-ncwqaixkgbgycybvpkgj:40forum.dlang.org

I think the issue of appealing to numerical programmers is 
worth some attention because there's a distinct niche that D is 
frustratingly close to filling.  In my field, researchers will 
often write scripts in a dynamic language, publish, iterate, 
and eventually re-write their software in C++ and release it as 
a library.  The re-writing step is a large time investment, but 
it's important because


  - Dynamic languages are either slow (MATLAB/Python/R) or 
immature (Julia).
  - Other researchers may prefer another dynamic language, but 
every relevant dynamic language can interface with native 
libraries.


D already has the speed and modeling power of C++, GC for clean 
API design, and reflection for automatic bindings, but it's 
missing a few key features required to make something like 
NumPy or the Julia standard library possible in D.  I believe 
DIP58 provides those features, and accepting DIP58 will make D 
a competitive alternative to the prototype/test/rewrite/release 
cycle.


On another note, I'm pretty new to D and the community, so let 
me know if there's any protocol I should follow with respect to 
DIPs and I'll get on it!


Cheers,
Mason


It's a nice proposal, but what happens if you want a range of 
floats, e.g., 1.0..2.0? I don't know if this causes any ambiguity 
or not. Also, as others said, the step syntax is a bit weird, and 
could probably be delegated to a library function quite easily, 
such as in one of your examples:


const evenEntries = vector[(1..11).by(2)];


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Chris Williams

On Monday, 17 March 2014 at 20:13:20 UTC, Mason McGill wrote:
Interesting, though I feel like operator syntax really shines 
when either
  1) It's significantly shorter/simpler than the equivalent 
function calls.

  2) It appeals to domain-specific intuitions.


In general, I agree. Though I think that my examples suffer from 
being poor examples and for allowing the most complete 
overridability (short of using lambdas). The .. operator could be 
written to only accept a constant step, like:


a ..!5 b;

The place where I was thinking that templating normal operators 
might be handy is actually in games, where you might want to (for 
example) treat a 4x4 matrix in the input as a 4x3 matrix during 
multiplication.


a *!M43 b;

Again, by restricting the allowed template parameters, rather 
than exposing code, you do end up with a shorter syntax, than a 
function call.


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Mason McGill
It's a nice proposal, but what happens if you want a range of 
floats, e.g., 1.0..2.0?


Correct me if I'm wrong, parsing would look like:


1.0..2.0
===  Found a literal.

1.0..2.0
   ==Found a binary operator.

1.0..2.0
 === Found a literal.


Something like `55` could also compile (since there's only 1 
valid parsing), though such a thing is clearly an abomination, so 
I'd write it `5. .. .5` or `(5.)..(.5)`.  The whole ordeal is 
probably a bit of insight into why other languages use the ':' 
character for slicing.


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Robert Schadek
replace .. with : to make lexing easier, please


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread H. S. Teoh
On Mon, Mar 17, 2014 at 11:16:12PM +0100, Robert Schadek wrote:
 replace .. with : to make lexing easier, please

auto b = arr[(someCondition) ? w:x : y:z];

:-(


T

-- 
Computers aren't intelligent; they only think they are.


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Robert Schadek
On 03/17/2014 11:24 PM, H. S. Teoh wrote:
 On Mon, Mar 17, 2014 at 11:16:12PM +0100, Robert Schadek wrote:
 replace .. with : to make lexing easier, please
   auto b = arr[(someCondition) ? w:x : y:z];

 :-(


 T

Thats a parsing problem.

1..1 makes you think you got a prefix of a float 1. but actually you got
an int slice_operator int. If there where no .. flex like generator
could handle D, at least as far as I can see it.


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread H. S. Teoh
On Mon, Mar 17, 2014 at 11:33:38PM +0100, Robert Schadek wrote:
 On 03/17/2014 11:24 PM, H. S. Teoh wrote:
  On Mon, Mar 17, 2014 at 11:16:12PM +0100, Robert Schadek wrote:
  replace .. with : to make lexing easier, please
  auto b = arr[(someCondition) ? w:x : y:z];
 
  :-(
 
 
  T
 
 Thats a parsing problem.
 
 1..1 makes you think you got a prefix of a float 1. but actually you
 got an int slice_operator int. If there where no .. flex like
 generator could handle D, at least as far as I can see it.

Point.

But still, syntax that makes lexing or parsing hard -- that scores
against this DIP.


T

-- 
Why can't you just be a nonconformist like everyone else? -- YHL


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Timon Gehr

On 03/17/2014 11:37 PM, H. S. Teoh wrote:

1..1 makes you think you got a prefix of a float 1. but actually you
got an int slice_operator int. If there where no .. flex like
generator could handle D, at least as far as I can see it.

Point.

But still, syntax that makes lexing or parsing hard -- that scores
against this DIP.



No, it does not. The lexer does not need to change.


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread deadalnix

On Monday, 17 March 2014 at 22:21:46 UTC, Robert Schadek wrote:

replace .. with : to make lexing easier, please


+1


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Robert Schadek
On 03/17/2014 11:43 PM, Timon Gehr wrote:
 No, it does not. The lexer does not need to change.
you're right, but at some distant  future I would like .. to be replaced
by :


Re: DIP58: .. as a Binary Operator

2014-03-17 Thread Mason McGill

On Monday, 17 March 2014 at 22:26:05 UTC, H. S. Teoh wrote:

On Mon, Mar 17, 2014 at 11:16:12PM +0100, Robert Schadek wrote:

replace .. with : to make lexing easier, please


auto b = arr[(someCondition) ? w:x : y:z];

:-(


T


Julia has both the ternary conditional and : as an operator.  
In practice, they rarely come up in the same expressions, and 
when they do, parentheses are an easy solution.


auto b = arr[someCondition ? (w:x) : (y:z)];

However, I think it's worth mentioning that--unless I've missed 
something--DIP58 doesn't introduce any parsing issues that aren't 
already present inside a SliceExpression:


struct S { void opSlice(real a, real b) {} }

S s;
s[5. .. .5]; // Compiles.
s[5... .5]; // Error.
s[5. ...5]; // Error.
s[55]; // Error.

This seems like reasonable behavior, in my opinion.

It seems like : and .. both have their pros and cons, but 
.. allows backwards compatibility to be preserved, and I don't 
see how : can be worked in elegantly without breaking lots of 
code.