www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Using map to create a sequence

  auto a =3D map!((a)=3D>2*a)(iota(10));

Appears to do exactly what is says on the can. However, whilst:

  auto threads =3D new Thread [ numberOfThreads ] ; =20
  foreach ( i ; 0 .. numberOfThreads ) {
    auto closedPartialSum ( ) {
      immutable ii =3D i ;
      return delegate ( ) { partialSum ( ii , sliceSize , delta ) ; } ;
    }
    threads[i] =3D new Thread ( closedPartialSum ) ;
  }
  foreach ( thread ; threads ) { thread.start ( ) ; }

works fine:

  auto threads =3D map ! ( ( int i ) {
      auto closedPartialSum ( ) {
        immutable ii =3D i ;
        return delegate ( ) { partialSum ( ii , sliceSize , delta
) ; } ;
      }
      return new Thread ( closedPartialSum ) ;
      } ) ( iota ( numberOfThreads ) ) ;
  foreach ( thread ; threads ) { thread.start ( ) ; }

causes a SIGSEGV:

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff73af700 (LWP 8840)]
0x000000000044f8a5 in
pi_d_threadsGlobalState_array_declarative.execute()
(this=3D0x7ffff7ed1fe0) at pi_d_threadsGlobalState_array_declarative.d:39
39	        return delegate ( ) { partialSum ( ii , sliceSize , delta
) ; } ;


This is with dmd 2.059 and so not a 2.060 thing.

Nudges in the right direction most welcome.

--=20
Russel.
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D
Dr Russel Winder      t: +44 20 7585 2200   voip: sip:russel.winder ekiga.n=
et
41 Buckmaster Road    m: +44 7770 465 077   xmpp: russel winder.org.uk
London SW11 1EN, UK   w: www.russel.org.uk  skype: russel_winder
Aug 04 2012