On Saturday, 19 April 2014 at 17:12:10 UTC, Ali Çehreli wrote:
On 04/19/2014 09:55 AM, MattCoder wrote:

> On Friday, 18 April 2014 at 20:02:41 UTC, Tim Holzschuh via
> Digitalmars-d-learn wrote:
> void main(){
>      int myfilter(int a){
>          static int[] b;

That static variable makes this solution non-reentrant...

Yes, you're completely right and I already knew that. But remember Like I said previously, I would like to convert that code to something close to "extensions" in C#, in that case I can take the address of the array to check if it's a new Filter or not. for example, current in D I can do this:

import std.stdio;
import std.array;
import std.range;
import std.algorithm;

void main(){
        int myfilter(int[] *addr, int a){
                static int[] b;
                static int[] *address;
                
                if(address != addr){
                        address = addr;
                        b.clear();
                }
                
                if(!b.canFind(a)){
                        b.insertInPlace(b.length, a);
                        return a;
                }
                return -1;
        }
        
        auto arr  = [1,1,2,3,2,2,4,5,5,1];      
        auto arr2 = [3,4,3,9,9,7,4,4,4,7];

        auto arrFiltered = arr.filter!(a => myfilter(&arr, a) >= 0);
        writeln(arrFiltered);
        
        auto arrFiltered2 = arr2.filter!(a => myfilter(&arr2, a) >= 0);
        writeln(arrFiltered2);  
}

But with extensions, the argument "address" (i.e: &arr) on the calling of myfilter can be avoided!

Matheus.

Reply via email to