[Swift-devel] Join function?

Mihael Hategan hategan at mcs.anl.gov
Tue Apr 3 14:44:33 CDT 2012


Nice!

I think though, fundamentally, there is no way to write this without
either of:
1. length(array)
2. head/tail(array) (with the ability compare with [] - isEmpty(array)).

But there might be ways in which the above could be accomplished.

Mihael

On Tue, 2012-04-03 at 15:09 -0400, Glen Hocky wrote:
> This seemed like an interesting challenge. The following works
> assuming swift knows how many elements you have. However, there are
> many simpler things I would /think/ should work that do not. There
> seem to possibly be some bugs (i.e. things that don't seem
> intentional) about declaring a variable before an iterate statement
> and then writing to it on each iterate statement. Hence the use of
> lists below. I will also put a second version after which I would
> think should work but does not
> 
> 
> Working:
> 
> 
>         $ swift test.swift 
>         Swift svn swift-r3826 cog-r2988
>         RunID: 20120403-1509-3xnsrx10
>         Progress:
>         SwiftScript trace: this:is:a:test
>         Final status:
> 
> 
> 
> 
>         (string j[]) join(string s[], string c, int n){
>             j[0]="";
>             iterate i {
>                 if(i<n-1){
>                     j[i+1]=@strcat( j[i], s[i]+c );
>                 }
>                 else{
>                     j[i+1]=@strcat( j[i], s[i] );
>                 }
>             } until(i==n-1);
>         }
>         string a[];
>         a[0] = "this";
>         a[1] = "is";
>         a[2] = "a";
>         a[3] = "test";
>         int nelements=4;
>         string j[];
>         j = join( a, ":", nelements );
>         trace(j[nelements]);
> 
> 
> Not working (error, jlist has multiple writers):
>         (string j) join(string s[], string c, int n){
>             string jlist[];
>             jlist[0] = "";
>             iterate i {
>                 if(i<n-1){
>                     jlist[i+1]=@strcat( jlist[i], s[i]+c );
>                 }
>                 else{
>                     jlist[i+1]=@strcat( jlist[i], s[i] );
>                 }
>             } until(i==n-1);
>             j = jlist[n];
>         }
>         string a[];
>         a[0] = "this";
>         a[1] = "is";
>         a[2] = "a";
>         a[3] = "test";
>         int nelements=4;
>         string j;
>         j = join( a, ":", nelements );
>         trace(j);
> 
> 
> 
> 
> 
> On Tue, Apr 3, 2012 at 2:02 PM, David Kelly <davidk at ci.uchicago.edu>
> wrote:
>         Hello,
>         
>         Is there a way to concatenate all elements of an array into a
>         single string? I would also like to define a separator between
>         elements. I was thinking of something similar to Perl's join
>         function.
>         
>         If I have:
>         
>         string a[];
>         a[0] = "this";
>         a[1] = "is";
>         a[2] = "a";
>         a[3] = "test";
>         
>         How can I get it into "this is a test" or "this:is:a:test"?
>         @strcat returns a reference. I can tracef with %q and get
>         "[this,is,a,test]", but it doesn't give me any control over
>         the formatting as far as I know.
>         
>         I could call a shell script to do this, just wondering if
>         there was another way.
>         
>         David
>         _______________________________________________
>         Swift-devel mailing list
>         Swift-devel at ci.uchicago.edu
>         https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel
> 
> 
> _______________________________________________
> Swift-devel mailing list
> Swift-devel at ci.uchicago.edu
> https://lists.ci.uchicago.edu/cgi-bin/mailman/listinfo/swift-devel





More information about the Swift-devel mailing list