Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
March 14, 2014 Function tuples | ||||
---|---|---|---|---|
| ||||
This comes from a Rosettacode entry: http://rosettacode.org/wiki/First-class_functions#D import std.stdio, std.math, std.typetuple, std.functional; enum static sin = (in real x) pure nothrow => std.math.sin(x), asin = (in real x) pure nothrow => std.math.asin(x), cos = (in real x) pure nothrow => std.math.cos(x), acos = (in real x) pure nothrow => std.math.acos(x), cube = (in real x) pure nothrow => x ^^ 3, cbrt = (in real x) /*pure*/ nothrow => std.math.cbrt(x); void main() { alias dir = TypeTuple!(sin, cos, cube); alias inv = TypeTuple!(asin, acos, cbrt); foreach (immutable i, f; dir) { writefln("%6.3f %6.3f", compose!(f, inv[i])(0.5), compose!(dir[i], inv[i])(0.5)); } } It prints: 0.500 0.500 0.866 0.500 0.713 0.500 Do you know why there's such difference in the results? (You can't define a staticZip in D?) Bye, bearophile |
March 14, 2014 Re: Function tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On 03/14/2014 09:37 AM, bearophile wrote: > This comes from a Rosettacode entry: > http://rosettacode.org/wiki/First-class_functions#D > > > import std.stdio, std.math, std.typetuple, std.functional; > > enum static sin = (in real x) pure nothrow => std.math.sin(x), > asin = (in real x) pure nothrow => std.math.asin(x), > cos = (in real x) pure nothrow => std.math.cos(x), > acos = (in real x) pure nothrow => std.math.acos(x), > cube = (in real x) pure nothrow => x ^^ 3, > cbrt = (in real x) /*pure*/ nothrow => std.math.cbrt(x); > > void main() { > alias dir = TypeTuple!(sin, cos, cube); > alias inv = TypeTuple!(asin, acos, cbrt); > foreach (immutable i, f; dir) { > writefln("%6.3f %6.3f", > compose!(f, inv[i])(0.5), > compose!(dir[i], inv[i])(0.5)); > } > } > > It prints: > > 0.500 0.500 > 0.866 0.500 > 0.713 0.500 DMD64 D Compiler v2.066-devel-1a70764 prints the following for me: 0.500 0.500 0.500 0.500 0.500 0.500 Maybe a bug fixed? (Or a bug introduced if you are using a more recent one. :) ) > > Do you know why there's such difference in the results? > > (You can't define a staticZip in D?) > > Bye, > bearophile Ali |
March 14, 2014 Re: Function tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to bearophile | On Friday, 14 March 2014 at 16:38:00 UTC, bearophile wrote: > This comes from a Rosettacode entry: > http://rosettacode.org/wiki/First-class_functions#D > > > import std.stdio, std.math, std.typetuple, std.functional; > > enum static sin = (in real x) pure nothrow => std.math.sin(x), > asin = (in real x) pure nothrow => std.math.asin(x), > cos = (in real x) pure nothrow => std.math.cos(x), > acos = (in real x) pure nothrow => std.math.acos(x), > cube = (in real x) pure nothrow => x ^^ 3, > cbrt = (in real x) /*pure*/ nothrow => std.math.cbrt(x); > > void main() { > alias dir = TypeTuple!(sin, cos, cube); > alias inv = TypeTuple!(asin, acos, cbrt); > foreach (immutable i, f; dir) { > writefln("%6.3f %6.3f", > compose!(f, inv[i])(0.5), > compose!(dir[i], inv[i])(0.5)); > } > } > > It prints: > > 0.500 0.500 > 0.866 0.500 > 0.713 0.500 > > Do you know why there's such difference in the results? > It's a bug, and quite a wierd one at that. See the output from this: http://dpaste.dzfl.pl/1962d61bb185 > (You can't define a staticZip in D?) You can. I hope it will end up in in std.meta, along with a whole load of other such goodies that I've been working on :) |
March 14, 2014 Re: Function tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Friday, 14 March 2014 at 17:10:53 UTC, John Colvin wrote:
> On Friday, 14 March 2014 at 16:38:00 UTC, bearophile wrote:
>> This comes from a Rosettacode entry:
>> http://rosettacode.org/wiki/First-class_functions#D
>>
>>
>> import std.stdio, std.math, std.typetuple, std.functional;
>>
>> enum static sin = (in real x) pure nothrow => std.math.sin(x),
>> asin = (in real x) pure nothrow => std.math.asin(x),
>> cos = (in real x) pure nothrow => std.math.cos(x),
>> acos = (in real x) pure nothrow => std.math.acos(x),
>> cube = (in real x) pure nothrow => x ^^ 3,
>> cbrt = (in real x) /*pure*/ nothrow => std.math.cbrt(x);
>>
>> void main() {
>> alias dir = TypeTuple!(sin, cos, cube);
>> alias inv = TypeTuple!(asin, acos, cbrt);
>> foreach (immutable i, f; dir) {
>> writefln("%6.3f %6.3f",
>> compose!(f, inv[i])(0.5),
>> compose!(dir[i], inv[i])(0.5));
>> }
>> }
>>
>> It prints:
>>
>> 0.500 0.500
>> 0.866 0.500
>> 0.713 0.500
>>
>> Do you know why there's such difference in the results?
>>
>
> It's a bug, and quite a wierd one at that. See the output from this: http://dpaste.dzfl.pl/1962d61bb185
It's calling sin every time instead of cos or cube
|
March 14, 2014 Re: Function tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli | Ali Çehreli:
> DMD64 D Compiler v2.066-devel-1a70764 prints the following for me:
>
> 0.500 0.500
> 0.500 0.500
> 0.500 0.500
>
> Maybe a bug fixed?
Probably yes, thank for all the answers :-)
Bye,
bearophile
|
March 14, 2014 Re: Function tuples | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | John Colvin:
>> (You can't define a staticZip in D?)
>
> You can. I hope it will end up in in std.meta, along with a whole load of other such goodies that I've been working on :)
Is the code for staticZip somewhere online?
Bye,
bearophile
|
Copyright © 1999-2021 by the D Language Foundation