| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
March 08, 2006 IFTI - first impressions | ||||
|---|---|---|---|---|
| ||||
Attachments: | Hello,
With the new IFTI support, I just had to do some quick tests. It turns out it works perfectly given its limitations. I had to rewrite some templates to be more IFTI-friendly. One example:
Before:
template filter(T:T[]) {
T[] filter(T[] arr, bool function func(T)) {
...
}
}
After:
template filter(ArrTy, FuncTy) {
ArrTy filter(ArrTy arr, FunTy fun) {
...
}
}
With a simple map and filter template, the following code works:
const int[] data = [1,2,3,76,2,1,3,45,2];
writefln("data = ", data);
auto squared = map(data, function int(int x) { return x*x; });
writefln("squared = ", squared);
auto sqrooted = map(data, function double(int x) { return
sqrt(cast(float)x); });
writefln("sqrooted = ", sqrooted);
auto even = filter(data, function bool(int x) { return (x&1) == 0; });
writefln("even = ", even);
auto odd = filter(data, function bool(int x) { return (x&1) == 1; });
writefln("odd = ", odd);
And prints:
data = [1,2,3,76,2,1,3,45,2]
squared = [1,4,9,5776,4,1,9,2025,4]
sqrooted = [1,1.41421,1.73205,8.7178,1.41421,1,1.73205,6.7082,1.41421]
even = [2,76,2,2]
odd = [1,3,1,3,45]
In conclusion, I'm very pleased.
I've attached the full 50-line source code if anyone is interested.
/Oskar
| |||
March 08, 2006 Re: IFTI - first impressions | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Oskar Linde | Oskar Linde skrev:
> const int[] data = [1,2,3,76,2,1,3,45,2];
> writefln("data = ", data);
>
> auto squared = map(data, function int(int x) { return x*x; });
> writefln("squared = ", squared);
>
> auto sqrooted = map(data, function double(int x) { return sqrt(cast(float)x); });
> writefln("sqrooted = ", sqrooted);
>
> auto even = filter(data, function bool(int x) { return (x&1) == 0; });
> writefln("even = ", even);
>
> auto odd = filter(data, function bool(int x) { return (x&1) == 1; });
> writefln("odd = ", odd);
I just noticed that with implicit array member functions, you can even write the last one as:
auto odd = data.filter(function bool(int x) { return (x&1) == 1; });
writefln("odd = ", odd);
Isn't this even better?
You can also make a:
template stable_sort(ArrTy) {
ArrTy stable_sort(ArrTy arr) {
...
}
}
and make a library alternative to the built in sort:
a.stable_sort();
The only difference to the built in sort is the tailing parenthesis. I wish we could get rid of those or force .sort to be called as .sort(). Then we could make .sort a pure library implementation together with other array functions.
/Oskar
| |||
March 08, 2006 Re: IFTI - first impressions | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Oskar Linde | Oskar Linde wrote:
> Hello,
>
> With the new IFTI support, I just had to do some quick tests. It turns out it works perfectly given its limitations. I had to rewrite some templates to be more IFTI-friendly. One example:
>
> Before:
>
> template filter(T:T[]) {
> T[] filter(T[] arr, bool function func(T)) {
> ...
> }
> }
>
> After:
>
> template filter(ArrTy, FuncTy) {
> ArrTy filter(ArrTy arr, FunTy fun) {
> ...
> }
> }
This should only be a temporary measure. Once IFTI matures a bit, your original function should work as expected. In fact, the first form is necessary in some cases to make sure the proper overload is called.
Sean
| |||
March 09, 2006 Re: IFTI - first impressions | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Oskar Linde | Oskar Linde wrote:
> Oskar Linde skrev:
>
>> const int[] data = [1,2,3,76,2,1,3,45,2];
>> writefln("data = ", data);
>>
>> auto squared = map(data, function int(int x) { return x*x; });
>> writefln("squared = ", squared);
>>
>
> auto odd = data.filter(function bool(int x) { return (x&1) == 1; });
> writefln("odd = ", odd);
>
Nifty IFTI!
It makes sense to start writing D template libraries, now.
I'm looking forward to seeing what is produced.
| |||
March 09, 2006 Re: IFTI - first impressions | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Sean Kelly | Sean Kelly wrote:
> Oskar Linde wrote:
>> Hello,
>>
>> With the new IFTI support, I just had to do some quick tests. It turns out it works perfectly given its limitations. I had to rewrite some templates to be more IFTI-friendly. One example:
>>
>> Before:
>>
>> template filter(T:T[]) {
>> T[] filter(T[] arr, bool function func(T)) {
>> ...
>> }
>> }
>>
>> After:
>>
>> template filter(ArrTy, FuncTy) {
>> ArrTy filter(ArrTy arr, FunTy fun) {
>> ...
>> }
>> }
>
> This should only be a temporary measure. Once IFTI matures a bit, your original function should work as expected. In fact, the first form is necessary in some cases to make sure the proper overload is called.
A quick way to make many cases of template specializations to work is to write a template wrapper function:
template func(A,B) {
void func(A a, B b) {
func_imp!(A,B)(a,b);
}
}
But it doesn't cover all cases of course...
/Oskar
| |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply