digitalmars.D.learn - Function tuples
- bearophile (27/27) Mar 14 2014 This comes from a Rosettacode entry:
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (8/34) Mar 14 2014 DMD64 D Compiler v2.066-devel-1a70764 prints the following for me:
- bearophile (4/10) Mar 14 2014 Probably yes, thank for all the answers :-)
- John Colvin (5/30) Mar 14 2014 It's a bug, and quite a wierd one at that. See the output from
- John Colvin (2/37) Mar 14 2014 It's calling sin every time instead of cos or cube
- bearophile (4/7) Mar 14 2014 Is the code for staticZip somewhere online?
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
Mar 14 2014
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.500DMD64 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, bearophileAli
Mar 14 2014
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
Mar 14 2014
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 :)
Mar 14 2014
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:It's calling sin every time instead of cos or cubeThis 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
Mar 14 2014
John Colvin:Is the code for staticZip somewhere online? Bye, bearophile(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 :)
Mar 14 2014