Show how to concatenate two arrays in your language.

Task
Array concatenation
You are encouraged to solve this task according to the task description, using any language you may know.
Task


If this is as simple as array1 + array2, so be it.

11l

<lang 11l>V arr1 = [1, 2, 3] V arr2 = [4, 5, 6] print(arr1 [+] arr2)</lang>

Output:
[1, 2, 3, 4, 5, 6]

68000 Assembly

In order for this to work, you'll either need to use malloc() or know a memory location of "free space" at compile time. This example shall use the latter.

<lang 68000devpac>ArrayRam equ $00FF2000 ;this label points to 4k of free space.

concatenate Array1 + Array2

LEA ArrayRam,A0 LEA Array1,A1 MOVE.W #5-1,D1 ;LEN(Array1), measured in words. JSR memcpy_w

after this, A0 will point to the destination of the second array.

LEA Array2,A1 ;even though the source arrays are stored back-to-back in memory, we'll assume they're not just for demonstration purposes. MOVE.W #5-1,D1 ;LEN(Array2), measured in words JSR memcpy_w

JMP * ;halt the CPU memcpy_w: MOVE.W (A1)+,(A0)+ DBRA D1,memcpy_w rts

Array1: DC.W 1,2,3,4,5 Array2: DC.W 6,7,8,9,10</lang>

8th

<lang Forth> [1,2,3] [4,5,6] a:+ . </lang>

Output:
[1,2,3,4,5,6]

AArch64 Assembly

Works with: as version Raspberry Pi 3B version Buster 64 bits

<lang AArch64 Assembly> /* ARM assembly AARCH64 Raspberry PI 3B */ /* program concAreaString.s */

/*******************************************/ /* Constantes file */ /*******************************************/ /* for this file see task include a file in language AArch64 assembly*/ .include "../includeConstantesARM64.inc" .equ NBMAXITEMS, 20 // /*******************************************/ /* Initialized data */ /*******************************************/ .data szMessLenArea: .asciz "The length of area 3 is : @ \n" szCarriageReturn: .asciz "\n"

/* areas strings */ szString1: .asciz "Apples" szString2: .asciz "Oranges" szString3: .asciz "Pommes" szString4: .asciz "Raisins" szString5: .asciz "Abricots"

/* pointer items area 1*/ tablesPoi1: pt1_1: .quad szString1 pt1_2: .quad szString2 ptVoid_1: .quad 0

/* pointer items area 2*/ tablesPoi2: pt2_1: .quad szString3 pt2_2: .quad szString4 pt2_3: .quad szString5 ptVoid_2: .quad 0 /*******************************************/ /* UnInitialized data */ /*******************************************/ .bss tablesPoi3: .skip 8 * NBMAXITEMS sZoneConv: .skip 30 /*******************************************/ /* code section */ /*******************************************/ .text .global main main: // entry of program

                           // copy area 1 ->  area 3
   ldr x1,qAdrtablesPoi1   // begin pointer area 1
   ldr x3,qAdrtablesPoi3   // begin pointer area 3
   mov x0,0                // counter

1:

   ldr x2,[x1,x0,lsl 3]    // read string pointer address item x0 (8 bytes by pointer)
   cbz x2,2f               // is null ?
   str x2,[x3,x0,lsl 3]    // no store pointer in area 3
   add x0,x0,1             // increment counter
   b 1b                    // and loop

2: // copy area 2 -> area 3

   ldr x1,qAdrtablesPoi2   // begin pointer area 2
   ldr x3,qAdrtablesPoi3   // begin pointer area 3
   mov x4,#0               // counter area 2

3: // x0 contains the first void item in area 3

   ldr x2,[x1,x4,lsl #3]   // read string pointer address item x0 (8 bytes by pointer)
   cbz x2,4f               // is null ?
   str x2,[x3,x0,lsl #3]   // no store pointer in area 3
   add x0,x0,1             // increment counter
   add x4,x4,1             // increment counter
   b 3b                    // and loop

4:

                           // count items number in area 3 
   ldr x1,qAdrtablesPoi3   // begin pointer table 
   mov x0,#0               // counter

5: // begin loop

   ldr x2,[x1,x0,lsl #3]   // read string pointer address item x0 (8 bytes by pointer)
   cmp x2,#0               // is null ?
   cinc x0,x0,ne           // no increment counter
   bne 5b                  // and loop

   ldr x1,qAdrsZoneConv    // conversion decimal
   bl conversion10S
   ldr x0,qAdrszMessLenArea
   ldr x1,qAdrsZoneConv 
   bl strInsertAtCharInc   // insert result at @ character
   bl affichageMess

100: // standard end of the program

   mov x0,0                // return code
   mov x8,EXIT             // request to exit program
   svc 0                   // perform the system call

qAdrtablesPoi1: .quad tablesPoi1 qAdrtablesPoi2: .quad tablesPoi2 qAdrtablesPoi3: .quad tablesPoi3 qAdrszMessLenArea: .quad szMessLenArea qAdrsZoneConv: .quad sZoneConv qAdrszCarriageReturn: .quad szCarriageReturn /****************************************************/ /* File Include fonctions */ /********************************************************/ /* for this file see task include a file in language AArch64 assembly */ .include "../includeARM64.inc" </lang>

ABAP

The concept of arrays does not exist in ABAP, instead internal tables are used. This works in ABAP version 7.40 and above.

<lang ABAP> report z_array_concatenation.

data(itab1) = value int4_table( ( 1 ) ( 2 ) ( 3 ) ). data(itab2) = value int4_table( ( 4 ) ( 5 ) ( 6 ) ).

append lines of itab2 to itab1.

loop at itab1 assigning field-symbol(<line>).

   write <line>.

endloop. </lang>

Output:
         1           2           3           4           5           6

ACL2

This is for lists, not arrays; ACL2's array support is limited. <lang Lisp>(append xs ys)</lang>

Action!

<lang Action!>BYTE FUNC Concat(INT ARRAY src1,src2,dst BYTE size1,size2)

 BYTE i
 FOR i=0 TO size1-1
 DO
   dst(i)=src1(i)
 OD
 FOR i=0 TO size2-1
 DO
   dst(size1+i)=src2(i)
 OD

RETURN (size1+size2)

PROC PrintArray(INT ARRAY a BYTE size)

 BYTE i
 Put('[)
 FOR i=0 TO size-1
 DO
   PrintI(a(i))
   IF i<size-1 THEN
     Put(' )
   FI
 OD
 Put('])

RETURN

PROC Test(INT ARRAY src1,src2 BYTE size1,size2)

 INT ARRAY res(20)
 BYTE size
 size=Concat(src1,src2,res,size1,size2)
 PrintArray(src1,size1)
 Put('+)
 PrintArray(src2,size2)
 Put('=)
 PrintArray(res,size)
 PutE() PutE()

RETURN

PROC Main()

 INT ARRAY
   a1=[1 2 3 4],
   a2=[5 6 7 8 9 10],
   ;a workaround for a3=[-1 -2 -3 -4 -5]
   a3=[65535 65534 65533 65532 65531]
 Test(a1,a2,4,6)
 Test(a2,a1,6,4)
 Test(a3,a2,5,4)

RETURN</lang>

Output:

Screenshot from Atari 8-bit computer

[1 2 3 4]+[5 6 7 8 9 10]=[1 2 3 4 5 6 7 8 9 10]

[5 6 7 8 9 10]+[1 2 3 4]=[5 6 7 8 9 10 1 2 3 4]

[-1 -2 -3 -4 -5]+[5 6 7 8]=[-1 -2 -3 -4 -5 5 6 7 8]

ActionScript

<lang ActionScript>var array1:Array = new Array(1, 2, 3); var array2:Array = new Array(4, 5, 6); var array3:Array = array1.concat(array2); //[1, 2, 3, 4, 5, 6]</lang>

Ada

In Ada arrays are concatenated using the operation &. It works with any one dimensioned array: <lang Ada>type T is array (Positive range <>) of Integer; X : T := (1, 2, 3); Y : T := X & (4, 5, 6); -- Concatenate X and (4, 5, 6)</lang>

Aime

<lang aime>ac(list a, b) {

   list o;
   o.copy(a);
   b.ucall(l_append, 1, o);
   o;

}

main(void) {

   list a, b, c;
   a = list(1, 2, 3, 4);
   b = list(5, 6, 7, 8);
   c = ac(a, b);
   c.ucall(o_, 1, " ");
   0;

}</lang>

Output:
 1 2 3 4 5 6 7 8

ALGOL 68

Works with: ALGOL 68 version Standard - no extensions to language used
Works with: ALGOL 68G version Any - tested with release 1.18.0-9h.tiny

Includes operators for appending and prefixing an array to an existing flexible array: <lang Algol68>MODE ARGTYPE = INT; MODE ARGLIST = FLEX[0]ARGTYPE;

OP + = (ARGLIST a, b)ARGLIST: (

 [LWB a:UPB a - LWB a + 1 + UPB b - LWB b + 1 ]ARGTYPE out;
 ( 
   out[LWB a:UPB a]:=a,
   out[UPB a+1:]:=b
 );
 out

);

  1. Append #

OP +:= = (REF ARGLIST lhs, ARGLIST rhs)ARGLIST: lhs := lhs + rhs; OP PLUSAB = (REF ARGLIST lhs, ARGLIST rhs)ARGLIST: lhs := lhs + rhs;

  1. Prefix #

OP +=: = (ARGLIST lhs, REF ARGLIST rhs)ARGLIST: rhs := lhs + rhs; OP PLUSTO = (ARGLIST lhs, REF ARGLIST rhs)ARGLIST: rhs := lhs + rhs;

ARGLIST a := (1,2),

       b := (3,4,5);

print(("a + b",a + b, new line));

VOID(a +:= b); print(("a +:= b", a, new line));

VOID(a +=: b); print(("a +=: b", b, new line))</lang>

a + b         +1         +2         +3         +4         +5
a +:= b         +1         +2         +3         +4         +5
a +=: b         +1         +2         +3         +4         +5         +3         +4         +5

ALGOL W

Algol W does not allow procedures to return arrays and has no mechanism for procedures to find the bounds of their parameters, so the caller must supply an array to concatenate into and the bounds of the arrays. <lang algolw>begin

   integer array a ( 1 :: 5 );
   integer array b ( 2 :: 4 );
   integer array c ( 1 :: 8 );
   % concatenates the arrays a and b into c                        %
   % the lower and upper bounds of each array must be specified in %
   % the corresponding *Lb and *Ub parameters                      %
   procedure arrayConcatenate ( integer array a ( * )
                              ; integer value aLb, aUb
                              ; integer array b ( * )
                              ; integer value bLb, bUb
                              ; integer array c ( * )
                              ; integer value cLb, cUb
                              ) ;
       begin
           integer cPos;
           assert( ( cUb - cLb ) + 1 >= ( ( aUb + bUb ) - ( aLb + bLb ) ) - 2 );
           cPos := cLb;
           for aPos := aLb until aUb do begin
               c( cPos ) := a( aPos );
               cPos := cPos + 1
           end for_aPos ;
           for bPos := bLb until bUb do begin
               c( cPos ) := b( bPos );
               cPos := cPos + 1
           end for_bPos
       end arrayConcatenate ;
   % test arrayConcatenate                                          %
   for aPos := 1 until 5 do a( aPos ) := aPos;
   for bPos := 2 until 4 do b( bPos ) := - bPos;
   arrayConcatenate( a, 1, 5, b, 2, 4, c, 1, 8 );
   for cPos := 1 until 8 do writeon( i_w := 1, s_w := 1, c( cPos ) )

end.</lang>

Output:
1 2 3 4 5 -2 -3 -4

Amazing Hopper

<lang Amazing Hopper>

  1. include <hbasic.h>

Begin

 a1 = {}
 a2 = {}
 Take(100,"Hola",0.056,"Mundo!"), and Push All(a1)
 Take("Segundo",0,"array",~True,~False), and Push All(a2)
 Concat (a1, a2) and Print ( a2, Newl )

End </lang>

Output:
Segundo,0,array,1,0,100,Hola,0.056,Mundo!

AntLang

<lang AntLang>a:<1; <2; 3>> b: <"Hello"; 42> c: a,b</lang>

Apex

<lang apex>List<String> listA = new List<String> { 'apple' }; List<String> listB = new List<String> { 'banana' }; listA.addAll(listB); System.debug(listA); // Prints (apple, banana)</lang>

APL

<lang apl>

   1 2 3 , 4 5 6

1 2 3 4 5 6 </lang>

AppleScript

<lang AppleScript> set listA to {1, 2, 3} set listB to {4, 5, 6} return listA & listB </lang>

Output:
{1, 2, 3, 4, 5, 6}


Or, if we treat the concatenation of two lists as a special case of the more general problem of concatenating N lists, we can write:

Translation of: JavaScript

<lang applescript>on run

 concat([["alpha", "beta", "gamma"], ¬
   ["delta", "epsilon", "zeta"], ¬
   ["eta", "theta", "iota"]])

end run


-- concat :: a -> [a] on concat(xxs)

 set lst to {}
 repeat with xs in xxs
   set lst to lst & xs
 end repeat
 return lst

end concat

</lang>

Output:
{"alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota"}

ARM Assembly

Works with: as version Raspberry Pi

<lang ARM Assembly> /* ARM assembly Raspberry PI */ /* program concAreaString.s */

/* Constantes */ .equ STDOUT, 1 @ Linux output console .equ EXIT, 1 @ Linux syscall .equ WRITE, 4 @ Linux syscall .equ NBMAXITEMS, 20 @ /* Initialized data */ .data szMessLenArea: .ascii "The length of area 3 is : " sZoneconv: .fill 12,1,' ' szCarriageReturn: .asciz "\n"

/* areas strings */ szString1: .asciz "Apples" szString2: .asciz "Oranges" szString3: .asciz "Pommes" szString4: .asciz "Raisins" szString5: .asciz "Abricots"

/* pointer items area 1*/ tablesPoi1: pt1_1: .int szString1 pt1_2: .int szString2 ptVoid_1: .int 0

/* pointer items area 2*/ tablesPoi2: pt2_1: .int szString3 pt2_2: .int szString4 pt2_3: .int szString5 ptVoid_2: .int 0

/* UnInitialized data */ .bss tablesPoi3: .skip 4 * NBMAXITEMS

/* code section */ .text .global main main: /* entry of program */

   push {fp,lr}    /* saves 2 registers */
   @ copy area 1 ->  area 3
   ldr r1,iAdrtablesPoi1  @ begin pointer area 1
   ldr r3,iAdrtablesPoi3  @ begin pointer area 3
   mov r0,#0    @ counter

1:

   ldr r2,[r1,r0,lsl #2]    @ read string pointer address item r0 (4 bytes by pointer)
   cmp r2,#0                @ is null ?
   strne r2,[r3,r0,lsl #2]    @ no store pointer in area 3
   addne r0,#1             @ increment counter
   bne 1b                  @ and loop
   @ copy area 2 ->  area 3
   ldr r1,iAdrtablesPoi2  @ begin pointer area 2
   ldr r3,iAdrtablesPoi3  @ begin pointer area 3
   mov r4,#0    @ counter area 2

2: @ r0 contains the first void item in area 3

   ldr r2,[r1,r4,lsl #2]    @ read string pointer address item r0 (4 bytes by pointer)
   cmp r2,#0                @ is null ?
   strne r2,[r3,r0,lsl #2]    @ no store pointer in area 3
   addne r0,#1             @ increment counter
   addne r4,#1             @ increment counter
   bne 2b                  @ and loop

@ count items number in area 3

   ldr r1,iAdrtablesPoi3  @ begin pointer table 
   mov r0,#0    @ counter

3: @ begin loop

   ldr r2,[r1,r0,lsl #2]    @ read string pointer address item r0 (4 bytes by pointer)
   cmp r2,#0                @ is null ?
   addne r0,#1             @ no increment counter
   bne 3b                  @ and loop

   ldr r1,iAdrsZoneconv   @ conversion decimal
   bl conversion10S
   ldr r0,iAdrszMessLenArea
   bl affichageMess

100: /* standard end of the program */

   mov r0, #0                  @ return code
   pop {fp,lr}                 @restaur 2 registers
   mov r7, #EXIT              @ request to exit program
   swi 0                       @ perform the system call

iAdrtablesPoi1: .int tablesPoi1 iAdrtablesPoi2: .int tablesPoi2 iAdrtablesPoi3: .int tablesPoi3 iAdrszMessLenArea: .int szMessLenArea iAdrsZoneconv: .int sZoneconv iAdrszCarriageReturn: .int szCarriageReturn /******************************************************************/ /* display text with size calculation */ /******************************************************************/ /* r0 contains the address of the message */ affichageMess:

   push {fp,lr}    			/* save  registres */ 
   push {r0,r1,r2,r7}    		/* save others registers */
   mov r2,#0   				/* counter length */

1: /* loop length calculation */

   ldrb r1,[r0,r2]  			/* read octet start position + index */
   cmp r1,#0       			/* if 0 its over */
   addne r2,r2,#1   			/* else add 1 in the length */
   bne 1b          			/* and loop */
                               /* so here r2 contains the length of the message */
   mov r1,r0        			/* address message in r1 */
   mov r0,#STDOUT      		/* code to write to the standard output Linux */
   mov r7, #WRITE             /* code call system "write" */
   swi #0                      /* call systeme */
   pop {r0,r1,r2,r7}     		/* restaur others registers */
   pop {fp,lr}    				/* restaur des  2 registres */ 
   bx lr	        			/* return  */

/***************************************************/ /* conversion register signed décimal */ /***************************************************/ /* r0 contient le registre */ /* r1 contient l adresse de la zone de conversion */ conversion10S:

   push {r0-r5,lr}    /* save des registres */
   mov r2,r1       /* debut zone stockage */
   mov r5,#'+'     /* par defaut le signe est + */
   cmp r0,#0       /* nombre négatif ? */
   movlt r5,#'-'     /* oui le signe est - */
   mvnlt r0,r0       /* et inversion en valeur positive */
   addlt r0,#1
   mov r4,#10   /* longueur de la zone */

1: /* debut de boucle de conversion */

   bl divisionpar10 /* division  */
   add r1,#48        /* ajout de 48 au reste pour conversion ascii */	
   strb r1,[r2,r4]  /* stockage du byte en début de zone r5 + la position r4 */
   sub r4,r4,#1      /* position précedente */
   cmp r0,#0     
   bne 1b	       /* boucle si quotient different de zéro */
   strb r5,[r2,r4]  /* stockage du signe à la position courante */
   subs r4,r4,#1   /* position précedente */
   blt  100f         /* si r4 < 0  fin  */
   /* sinon il faut completer le debut de la zone avec des blancs */
   mov r3,#' '   /* caractere espace */	

2:

   strb r3,[r2,r4]  /* stockage du byte  */
   subs r4,r4,#1   /* position précedente */
   bge 2b        /* boucle si r4 plus grand ou egal a zero */

100: /* fin standard de la fonction */

   pop {r0-r5,lr}   /*restaur desregistres */
   bx lr   

/***************************************************/ /* division par 10 signé */ /* Thanks to http://thinkingeek.com/arm-assembler-raspberry-pi/* /* and http://www.hackersdelight.org/ */ /***************************************************/ /* r0 contient le dividende */ /* r0 retourne le quotient */ /* r1 retourne le reste */ divisionpar10:

 /* r0 contains the argument to be divided by 10 */
  push {r2-r4}   /* save registers  */
  mov r4,r0 
  ldr r3, .Ls_magic_number_10 /* r1 <- magic_number */
  smull r1, r2, r3, r0   /* r1 <- Lower32Bits(r1*r0). r2 <- Upper32Bits(r1*r0) */
  mov r2, r2, ASR #2     /* r2 <- r2 >> 2 */
  mov r1, r0, LSR #31    /* r1 <- r0 >> 31 */
  add r0, r2, r1         /* r0 <- r2 + r1 */
  add r2,r0,r0, lsl #2   /* r2 <- r0 * 5 */
  sub r1,r4,r2, lsl #1   /* r1 <- r4 - (r2 * 2)  = r4 - (r0 * 10) */
  pop {r2-r4}
  bx lr                  /* leave function */
  bx lr                  /* leave function */

.Ls_magic_number_10: .word 0x66666667

</lang>

Arturo

<lang rebol>arr1: [1 2 3] arr2: ["four" "five" "six"]

print arr1 ++ arr2</lang>

Output:
1 2 3 four five six

ATS

The following may seem frightening. However, it probably compiles down to two calls to __builtin_memcpy. All the complexity is to make sure those calls are done correctly.

<lang ats>(* The Rosetta Code array concatenation task, in ATS2. *)

(* In a way, the task is misleading: in a language such as ATS, one

  can always devise a very-easy-to-use array type, put the code for
  that in a library, and overload operators. Thus we can have
  "array1 + array2" as array concatenation in ATS, complete with
  garbage collection when the result no longer is needed.
  It depends on what libraries are in one's repertoire.
  Nevertheless, it seems fair to demonstrate how to concatenate two
  barebones arrays at the nitpicking lowest level, without anything
  but the barest contents of the ATS2 prelude. It will make ATS
  programming look difficult; but ATS programming *is* difficult,
  when you are using it to overcome the programming safety
  deficiencies of a language such as C, without losing the runtime
  efficiency of C code.
  What we want is the kind of routine that would be used *in the
  implementation* of "array1 + array2". So let us begin ... *)
  1. include "share/atspre_staload.hats" (* Loads some needed template
                                       code. *)

fn {t : t@ype}

(* The demonstration will be for arrays of a non-linear type t. Were

  the arrays to contain a *linear* type (vt@ype), then either the old
  arrays would have to be destroyed or a copy procedure would be
  needed for the elements. *)

arrayconcat1 {m, n : nat}

            {pa, pb, pc : addr}
            (pfa  : !(@[t][m]) @ pa,
             pfb  : !(@[t][n]) @ pb,
             pfc  : !(@[t?][m + n]) @ pc >> @[t][m + n] @ pc |
             pa   : ptr pa,
             pb   : ptr pb,
             pc   : ptr pc,
             m    : size_t m,
             n    : size_t n) : void =

(* The routine takes as arguments three low-level arrays, passed by

  value, as pointers with associated views. The first array is of
  length m, with elements of type t, and the array must have been
  initialized; the second is a similar array of length n. The third
  array is uninitialized (thus the "?" character) and must have
  length m+n; its type will change to "initialized". *)
 {
   prval (pfleft, pfright) = array_v_split {t?} {pc} {m + n} {m} pfc

(* We have had to split the view of array c into a left part pfleft,

  of length m, and a right part pfright of length n. Arrays a and b
  will be copied into the respective parts of c. *)
   val _ = array_copy<t> (!pc, !pa, m)
   val _ = array_copy<t> (!(ptr_add<t> (pc, m)), !pb, n)

(* Copying an array *safely* is more complex than what we are doing

  here, but above the task has been given to the "array_copy"
  template in the prelude. The "!" signs appear because array_copy is
  call-by-reference but we are passing it pointers. *)

(* pfleft and pfright now refer to *initialized* arrays: one of length

  m, starting at address pc; the other of length n, starting at
  address pc+(m*sizeof<t>). *)
   prval _ = pfc := array_v_unsplit {t} {pc} {m, n} (pfleft, pfright)

(* Before we can exit, the view of array c has to be replaced. It is

  replaced by "unsplitting" the (now initialized) left and right
  parts of the array. *)

(* We are done. Everything should now work, and the result will be

  safe from buffer overruns or underruns, and against accidental
  misuse of uninitialized data. *)
 }

(* arrayconcat2 is a pass-by-reference interface to arrayconcat1. *) fn {t : t@ype} arrayconcat2 {m, n : nat}

            (a    : &(@[t][m]),
             b    : &(@[t][n]),
             c    : &(@[t?][m + n]) >> @[t][m + n],
             m    : size_t m,
             n    : size_t n) : void =
 arrayconcat1 (view@ a, view@ b, view@ c |
               addr@ a, addr@ b, addr@ c, m, n)

(* Overloads to let you say "arrayconcat" for either routine above. *) overload arrayconcat with arrayconcat1 overload arrayconcat with arrayconcat2

implement main0 () =

(* A demonstration program. *)

 let
   (* Some arrays on the stack. Because they are on the stack, they
      will not need explicit freeing. *)
   var a = @[int][3] (1, 2, 3)
   var b = @[int][4] (5, 6, 7, 8)
   var c : @[int?][7]
 in
   (* Compute c as the concatenation of a and b. *)
   arrayconcat<int> (a, b, c, i2sz 3, i2sz 4);
   (* The following simply prints the result. *)
   let
     (* Copy c to a linear linked list, because the prelude provides
        means to easily print such a list. *)
     val lst = array2list (c, i2sz 7)
   in
     println! (lst);      (* Print the list. *)
     free lst             (* The list is linear and must be freed. *)
   end
 end</lang>
Output:
$ patscc -O2 -DATS_MEMALLOC_LIBC arrayconcat.dats && ./a.out
1, 2, 3, 5, 6, 7, 8

Footnotes:

  • The ATS prelude does in fact translate calls to array_copy into C calls to memcpy. On a GNU system, the memcpy calls will likely become calls to __builtin_memcpy. The prelude's implementation is a practical one, rather than a strict demonstration of ATS methods.
  • The "-DATS_MEMALLOC_LIBC" is needed due to the copying of an array to a linear linked list, which has to be both malloc'd and free'd. The arrays themselves are allocated on the stack, in this example.

AutoHotkey

True Arrays

Works with: AutoHotkey_L

<lang AHK>List1 := [1, 2, 3] List2 := [4, 5, 6] cList := Arr_concatenate(List1, List2) MsgBox % Arr_disp(cList) ; [1, 2, 3, 4, 5, 6]

Arr_concatenate(p*) {

   res := Object()
   For each, obj in p
       For each, value in obj
           res.Insert(value)
   return res

}

Arr_disp(arr) {

   for each, value in arr
       res .= ", " value
   return "[" SubStr(res, 3) "]"

}</lang>

Legacy versions

AutoHotkey_Basic does not have real Arrays, but the user can implement them quite easily. For example: <lang AutoHotkey>List1 = 1,2,3 List2 = 4,5,6

List2Array(List1 , "Array1_") List2Array(List2 , "Array2_")

ConcatArrays("Array1_", "Array2_", "MyArray") MsgBox, % Array2List("MyArray")


---------------------------------------------------------------------------

ConcatArrays(A1, A2, A3) { ; concatenates the arrays A1 and A2 to A3

---------------------------------------------------------------------------
   local i := 0
   %A3%0 := %A1%0 + %A2%0
   Loop, % %A1%0
       i++, %A3%%i% := %A1%%A_Index%
   Loop, % %A2%0
       i++, %A3%%i% := %A2%%A_Index%

}


---------------------------------------------------------------------------

List2Array(List, Array) { ; creates an array from a comma separated list

---------------------------------------------------------------------------
   global
   StringSplit, %Array%, List, `,

}


---------------------------------------------------------------------------

Array2List(Array) { ; returns a comma separated list from an array

---------------------------------------------------------------------------
   Loop, % %Array%0
       List .= (A_Index = 1 ? "" : ",") %Array%%A_Index%
   Return, List

}</lang> Message box shows:

1,2,3,4,5,6

AutoIt

_ArrayConcatenate is a standard function in Autoit, there´s no need to write it on your own


<lang AutoIt> _ArrayConcatenate($avArray, $avArray2) Func _ArrayConcatenate(ByRef $avArrayTarget, Const ByRef $avArraySource, $iStart = 0) If Not IsArray($avArrayTarget) Then Return SetError(1, 0, 0) If Not IsArray($avArraySource) Then Return SetError(2, 0, 0) If UBound($avArrayTarget, 0) <> 1 Then If UBound($avArraySource, 0) <> 1 Then Return SetError(5, 0, 0) Return SetError(3, 0, 0) EndIf If UBound($avArraySource, 0) <> 1 Then Return SetError(4, 0, 0)

Local $iUBoundTarget = UBound($avArrayTarget) - $iStart, $iUBoundSource = UBound($avArraySource) ReDim $avArrayTarget[$iUBoundTarget + $iUBoundSource] For $i = $iStart To $iUBoundSource - 1 $avArrayTarget[$iUBoundTarget + $i] = $avArraySource[$i] Next

Return $iUBoundTarget + $iUBoundSource EndFunc  ;==>_ArrayConcatenate </lang>

Avail

<lang Avail><1, 2, 3> ++ <¢a, ¢b, ¢c></lang>

AWK

<lang AWK>#!/usr/bin/awk -f BEGIN {

   split("cul-de-sac",a,"-")
   split("1-2-3",b,"-")
   concat_array(a,b,c)
   for (i in c) {
       print i,c[i]
   }

}

function concat_array(a,b,c, nc) {

   for (i in a) {
       c[++nc]=a[i]	
   }
   for (i in b) {
      c[++nc]=b[i]	
   }

}</lang>

Babel

<lang babel>[1 2 3] [4 5 6] cat ;</lang>

Output:
[val 0x1 0x2 0x3 0x4 0x5 0x6 ]

bash

<lang bash>x=("1 2" "3 4") y=(5 6) sum=( "${x[@]}" "${y[@]}" )

for i in "${sum[@]}" ; do echo "$i" ; done 1 2 3 4 5 6</lang>

BASIC

BaCon

<lang bacon>DECLARE a[] = { 1, 2, 3, 4, 5 } DECLARE b[] = { 6, 7, 8, 9, 10 }

DECLARE c ARRAY UBOUND(a) + UBOUND(b)

FOR x = 0 TO 4

   c[x] = a[x]
   c[x+5] = b[x]

NEXT</lang>

BBC BASIC

<lang bbcbasic> DIM a(3), b(4)

     a() = 1, 2, 3, 4
     b() = 5, 6, 7, 8, 9
     PROCconcat(a(), b(), c())
     
     FOR i% = 0 TO DIM(c(),1)
       PRINT c(i%)
     NEXT
     END
     
     DEF PROCconcat(a(), b(), RETURN c())
     LOCAL s%, na%, nb%
     s% = ^a(1) - ^a(0) : REM Size of each array element
     na% = DIM(a(),1)+1 : REM Number of elements in a()
     nb% = DIM(b(),1)+1 : REM Number of elements in b()
     DIM c(na%+nb%-1)
     SYS "RtlMoveMemory", ^c(0), ^a(0), s%*na%
     SYS "RtlMoveMemory", ^c(na%), ^b(0), s%*nb%
     ENDPROC</lang>

Commodore BASIC

(Based on ZX Spectrum BASIC version) <lang basic>10 X=4 : Y=5 20 DIM A(X) : DIM B(Y) : DIM C(X+Y) 30 FOR I=1 TO X 40 : A(I) = I 50 NEXT 60 FOR I=1 TO Y 70 : B(I) = I*10 80 NEXT 90 FOR I=1 TO X 100 : C(I) = A(I) 110 NEXT 120 FOR I=1 TO Y 130 : C(X+I) = B(I) 140 NEXT 150 FOR I=1 TO X+Y 160 : PRINT C(I); 170 NEXT</lang>


BASIC256

<lang basic256>arraybase 1 global c

dimen = 5 dim a(dimen) dim b(dimen)

  1. Array initialization

for i = 1 to dimen a[i] = i b[i] = i + dimen next i

nt = ConcatArrays(a, b)

for i = 1 to nt print c[i]; if i < nt then print ", "; next i end

function ConcatArrays(a, b) ta = a[?] tb = b[?]

nt = ta + tb redim c(nt)

for i = 1 to ta c[i] = a[i] next i for i = 1 to tb c[i + ta] = b[i] next i

return nt end function</lang>

Output:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10


BQN

<lang bqn>1‿2‿3 ∾ 4‿5‿6</lang>

Bracmat

Bracmat concatenates lists composed with the comma, space, addition and multiplication operators. Furthermore, lists composed with the addition and multiplication operators are canonically sorted and like terms or factors are combined algebraically. Lists composed with the space operator automatically delete any elements with zero-length atoms and no prefixes. All these lists except the comma-separated list support a notion of 'array index', but as the underlying datastructure is a linked list and not an array, accessing, say, the millionth element can be slow. Examples of concatenation (entered on the Bracmat command line):

{?} (a,b,c,d,e),(n,m)
{!} a,b,c,d,e,n,m
{?} (a,m,y),(b,n,y,z)
{!} a,m,y,b,n,y,z
{?} (a m y) (b n y z)
{!} a m y b n y z
{?} (a+m+y)+(b+n+y+z)
{!} a+b+m+n+2*y+z
{?} (a*m*y)*(b*n*y*z)
{!} a*b*m*n*y^2*z

Concatenate three lists and split the concatenated list using a position operator:

{?} (a b c d) (e f g h) (i j k):?A [7 ?Z
{!} a b c d e f g h i j k
{?} !A
{!} a b c d e f g
{?} !Z
{!} h i j k

Burlesque

<lang burlesque> blsq ) {1 2 3}{4 5 6}_+ {1 2 3 4 5 6} </lang>

C

A way to concatenate two C arrays when you know their size (and usually so it is) <lang c>#include <stdlib.h>

  1. include <stdio.h>
  2. include <string.h>
  1. define ARRAY_CONCAT(TYPE, A, An, B, Bn) \
 (TYPE *)array_concat((const void *)(A), (An), (const void *)(B), (Bn), sizeof(TYPE));

void *array_concat(const void *a, size_t an,

                  const void *b, size_t bn, size_t s)

{

 char *p = malloc(s * (an + bn));
 memcpy(p, a, an*s);
 memcpy(p + an*s, b, bn*s);
 return p;

}

// testing const int a[] = { 1, 2, 3, 4, 5 }; const int b[] = { 6, 7, 8, 9, 0 };

int main(void) {

 unsigned int i;
 int *c = ARRAY_CONCAT(int, a, 5, b, 5);
 for(i = 0; i < 10; i++)
   printf("%d\n", c[i]);
 free(c);
 return EXIT_SUCCCESS;

}</lang>

C#

<lang csharp>using System;

namespace RosettaCode {

   class Program
   {
       static void Main(string[] args)
       {
           int[] a = { 1, 2, 3 };
           int[] b = { 4, 5, 6 };
           int[] c = new int[a.Length + b.Length];
           a.CopyTo(c, 0);
           b.CopyTo(c, a.Length);
           foreach(int n in c)
           {
               Console.WriteLine(n.ToString());
           }
       }
   }

}</lang>

Alternatively, using LINQ extension methods:

Works with: C# version 3

<lang csharp>using System.Linq;

class Program {

   static void Main(string[] args)
   {
       int[] a = { 1, 2, 3 };
       int[] b = { 4, 5, 6 };
       int[] c = a.Concat(b).ToArray();
   }

}</lang>

C++

<lang cpp>#include <vector>

  1. include <iostream>

int main() {

 std::vector<int> a(3), b(4);
 a[0] = 11; a[1] = 12; a[2] = 13;
 b[0] = 21; b[1] = 22; b[2] = 23; b[3] = 24;
 a.insert(a.end(), b.begin(), b.end());
 for (int i = 0; i < a.size(); ++i)
   std::cout << "a[" << i << "] = " << a[i] << "\n";

}</lang>

Works with: C++11

Similar to above but using initialization schematics.

<lang cpp>#include <vector>

  1. include <iostream>

int main() {

 std::vector<int> a {1, 2, 3, 4};
 std::vector<int> b {5, 6, 7, 8, 9};
 a.insert(a.end(), b.begin(), b.end());
 for(int& i: a) std::cout << i << " ";
 std::cout << std::endl;
 return 0;

}</lang>

This is another solution with function level templates and pointers.

<lang cpp>#include <iostream>

using namespace std;

template <typename T1, typename T2> int* concatArrays( T1& array_1, T2& array_2) {

 int arrayCount_1 = sizeof(array_1) / sizeof(array_1[0]);
 int arrayCount_2 = sizeof(array_2) / sizeof(array_2[0]);
 int newArraySize = arrayCount_1 + arrayCount_2;
 int *p = new int[newArraySize];
 for (int i = 0; i < arrayCount_1; i++) {
   p[i] = array_1[i];
 }
 for (int i = arrayCount_1; i < newArraySize; i++) {
   int newIndex = i-arrayCount_2;
   if (newArraySize % 2 == 1)

newIndex--;

   p[i] = array_2[newIndex];
   cout << "i: " << i << endl;
   cout << "array_2[i]: " << array_2[newIndex] << endl;
   cout << endl;
 }
 return p;

}

int main() {

 int ary[4] = {1, 2, 3, 123};
 int anotherAry[3] = {4, 5, 6};
 
 int *r = concatArrays(ary, anotherAry);
 cout << *(r + 0) << endl;
 cout << *(r + 1) << endl;
 cout << *(r + 2) << endl;
 cout << *(r + 3) << endl;
 cout << *(r + 4) << endl;
 cout << *(r + 5) << endl;
 cout << *(r + 6) << endl;
 delete r;
 return 0;

}</lang>

Ceylon

<lang ceylon>shared void arrayConcatenation() { value a = Array {1, 2, 3}; value b = Array {4, 5, 6}; value c = concatenate(a, b); print(c); }</lang>

Clojure

<lang clojure>(concat [1 2 3] [4 5 6])</lang> The inputs can be any collection, including Java arrays, and returns a lazy sequence of the elements.

A vector is the closest Clojure thing to an array. If a vector is wanted, then use <lang clojure>(into [1 2 3] [4 5 6])</lang>

COBOL

<lang COBOL> identification division.

      program-id. array-concat.
      environment division.
      configuration section.
      repository.
          function all intrinsic.
      data division.
      working-storage section.
      01 table-one.
         05 int-field pic 999 occurs 0 to 5 depending on t1.
      01 table-two.
         05 int-field pic 9(4) occurs 0 to 10 depending on t2.
      77 t1           pic 99.
      77 t2           pic 99.
      77 show         pic z(4).
      procedure division.
      array-concat-main.
      perform initialize-tables
      perform concatenate-tables
      perform display-result
      goback.
      initialize-tables.
          move 4 to t1
          perform varying tally from 1 by 1 until tally > t1
              compute int-field of table-one(tally) = tally * 3
          end-perform
          move 3 to t2
          perform varying tally from 1 by 1 until tally > t2
              compute int-field of table-two(tally) = tally * 6
          end-perform
      .
      concatenate-tables.
          perform varying tally from 1 by 1 until tally > t1
              add 1 to t2
              move int-field of table-one(tally)
                to int-field of table-two(t2)
          end-perform
      .
      display-result.
          perform varying tally from 1 by 1 until tally = t2
              move int-field of table-two(tally) to show
              display trim(show) ", " with no advancing
          end-perform
          move int-field of table-two(tally) to show
          display trim(show)
      .
      end program array-concat.</lang>
Output:
prompt$ cobc -xjd array-concatenation.cob
6, 12, 18, 3, 6, 9, 12

CoffeeScript

<lang coffeescript>

  1. like in JavaScript

a = [1, 2, 3] b = [4, 5, 6] c = a.concat b </lang>

Common Lisp

concatenate is a general function for concatenating any type of sequence. It takes the type of sequence to produce, followed by any number of sequences of any type. <lang lisp>(concatenate 'vector #(0 1 2 3) #(4 5 6 7))

 => #(0 1 2 3 4 5 6 7)</lang>

Alternate solution

I use Allegro CL 10.1

<lang lisp> (setf arr1 (make-array '(3) :initial-contents '(1 2 3))) (setf arr2 (make-array '(3) :initial-contents '(4 5 6))) (setf arr3 (make-array '(3) :initial-contents '(7 8 9))) (setf arr4 (make-array '(6))) (setf arr5 (make-array '(9))) (setf arr4 (concatenate `(vector ,(array-element-type arr1)) arr1 arr2)) (format t "~a" "concatenate arr1 and arr2: ") (write arr4) (terpri) (setf arr5 (concatenate `(vector ,(array-element-type arr1)) arr4 arr3)) (format t "~a" "concatenate arr4 and arr3: ") (write arr5) (terpri) </lang> Output:

concatenate arr1 and arr2: #(1 2 3 4 5 6)
concatenate arr4 and arr3: #(1 2 3 4 5 6 7 8 9)

Component Pascal

BlackBox Component Builder <lang oberon2> MODULE ArrayConcat; IMPORT StdLog;

PROCEDURE Concat(x: ARRAY OF INTEGER; y: ARRAY OF INTEGER; OUT z: ARRAY OF INTEGER); VAR i: INTEGER; BEGIN ASSERT(LEN(x) + LEN(y) <= LEN(z)); FOR i := 0 TO LEN(x) - 1 DO z[i] := x[i] END; FOR i := 0 TO LEN(y) - 1 DO z[i + LEN(x)] := y[i] END END Concat;

PROCEDURE Concat2(x: ARRAY OF INTEGER;y: ARRAY OF INTEGER): POINTER TO ARRAY OF INTEGER; VAR z: POINTER TO ARRAY OF INTEGER; i: INTEGER; BEGIN NEW(z,LEN(x) + LEN(y)); FOR i := 0 TO LEN(x) - 1 DO z[i] := x[i] END; FOR i := 0 TO LEN(y) - 1 DO z[i + LEN(x)] := y[i] END; RETURN z; END Concat2;

PROCEDURE ShowArray(x: ARRAY OF INTEGER); VAR i: INTEGER; BEGIN i := 0; StdLog.Char('['); WHILE (i < LEN(x)) DO StdLog.Int(x[i]);IF i < LEN(x) - 1 THEN StdLog.Char(',') END; INC(i) END; StdLog.Char(']');StdLog.Ln; END ShowArray;

PROCEDURE Do*; VAR x: ARRAY 10 OF INTEGER; y: ARRAY 15 OF INTEGER; z: ARRAY 25 OF INTEGER; w: POINTER TO ARRAY OF INTEGER; i: INTEGER; BEGIN FOR i := 0 TO LEN(x) - 1 DO x[i] := i END; FOR i := 0 TO LEN(y) - 1 DO y[i] := i END; Concat(x,y,z);StdLog.String("1> ");ShowArray(z);

NEW(w,LEN(x) + LEN(y)); Concat(x,y,z);StdLog.String("2:> ");ShowArray(z);

StdLog.String("3:> ");ShowArray(Concat2(x,y)); END Do;

END ArrayConcat. </lang> Execute: ^Q ArrayConcat.Do

Output:
1> [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
2:> [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
3:> [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

Crystal

<lang ruby>arr1 = [1, 2, 3] arr2 = ["foo", "bar", "baz"] arr1 + arr2 #=> [1, 2, 3, "foo", "bar", "baz"]</lang>

D

<lang d>import std.stdio: writeln;

void main() {

   int[] a = [1, 2];
   int[] b = [4, 5, 6];

   writeln(a, " ~ ", b, " = ", a ~ b);

}</lang>

Output:
[1, 2] ~ [4, 5, 6] = [1, 2, 4, 5, 6]

Delphi

<lang delphi>type

 TReturnArray = array of integer; //you need to define a type to be able to return it

function ConcatArray(a1,a2:array of integer):TReturnArray; var

 i,r:integer;

begin

 { Low(array) is not necessarily 0 }
 SetLength(result,High(a1)-Low(a1)+High(a2)-Low(a2)+2); //BAD idea to set a length you won't release, just to show the idea!
 r:=0; //index on the result may be different to indexes on the sources
 for i := Low(a1) to High(a1) do begin
   result[r] := a1[i];
   Inc(r);
 end;
 for i := Low(a2) to High(a2) do begin
   result[r] := a2[i];
   Inc(r);
 end;

end;

procedure TForm1.Button1Click(Sender: TObject); var

 a1,a2:array of integer;
 r1:array of integer;
 i:integer;

begin

 SetLength(a1,4);
 SetLength(a2,3);
 for i := Low(a1) to High(a1) do
   a1[i] := i;
 for i := Low(a2) to High(a2) do
   a2[i] := i;
 TReturnArray(r1) := ConcatArray(a1,a2);
 for i := Low(r1) to High(r1) do
   showMessage(IntToStr(r1[i]));
 Finalize(r1); //IMPORTANT!
 ShowMessage(IntToStr(High(r1)));

end;</lang>

Diego

<lang diego>set_namespace(rosettacode)_me();

add_ary(a)_values(1,2,3); add_ary(b)_values(4,5,6); me_msg()_ary[a]_concat[b] me_msg()_ary[a]_concat()_ary[b]; // alternative me_msg()_calc([a]+[b]); // alternative

reset_namespace[];</lang>

Dyalect

<lang dyalect>var xs = [1,2,3] var ys = [4,5,6] var alls = Array.Concat(xs, ys) print(alls)</lang>

Output:
[1, 2, 3, 4, 5, 6]

E

<lang e>? [1,2] + [3,4]

  1. value: [1, 2, 3, 4]</lang>

EasyLang

<lang>a[] = [ 1 2 3 ] b[] = [ 4 5 6 ] c[] = a[] while i < len b[]

 c[] &= b[i]
 i += 1

. print c[]</lang>

EchoLisp

The native operators are append for lists, and vector-append for vectors (1-dim arrays). <lang scheme>

VECTORS

(vector-append (make-vector 6 42) (make-vector 4 666))

   → #( 42 42 42 42 42 42 666 666 666 666)
LISTS

(append (iota 5) (iota 6))

  → (0 1 2 3 4 0 1 2 3 4 5)
NB - append may also be used with sequences (lazy lists)

(lib 'sequences)

  (take (append [1 .. 7] [7 6 .. 0]) #:all)
  → (1 2 3 4 5 6 7 6 5 4 3 2 1)


</lang>

ECL

<lang>

  A := [1, 2, 3, 4];
  B := [5, 6, 7, 8];
  C := A + B;</lang>

Efene

using the ++ operator and the lists.append function

<lang efene> @public run = fn () {

   A = [1, 2, 3, 4]
   B = [5, 6, 7, 8]
   C = A ++ B
   D = lists.append([A, B])
   io.format("~p~n", [C])
   io.format("~p~n", [D])

}</lang>

EGL

Works with: EDT

<lang EGL> program ArrayConcatenation

   function main()
       a int[] = [ 1, 2, 3 ];

b int[] = [ 4, 5, 6 ]; c int[]; c.appendAll(a); c.appendAll(b);

for (i int from 1 to c.getSize()) SysLib.writeStdout("Element " :: i :: " = " :: c[i]); end

   end

end </lang>

Ela

<lang ela>xs = [1,2,3] ys = [4,5,6] xs ++ ys</lang>

Output:
[1,2,3,4,5,6]

Elena

ELENA 5.0 : <lang elena>import extensions;

public program() {

   var a := new int[]{1,2,3};
   var b := new int[]{4,5};
   console.printLine(
       "(",a.asEnumerable(),") + (",b.asEnumerable(),
       ") = (",(a + b).asEnumerable(),")").readChar();

}</lang>

Output:
(1,2,3) + (4,5) = (1,2,3,4,5)

Elixir

<lang elixir>iex(1)> [1, 2, 3] ++ [4, 5, 6] [1, 2, 3, 4, 5, 6] iex(2)> Enum.concat([[1, [2], 3], [4], [5, 6]]) [1, [2], 3, 4, 5, 6] iex(3)> Enum.concat([1..3, [4,5,6], 7..9]) [1, 2, 3, 4, 5, 6, 7, 8, 9]</lang>

Elm

<lang elm>import Element exposing (show, toHtml) -- elm-package install evancz/elm-graphics import Html.App exposing (beginnerProgram) import Array exposing (Array, append, initialize)


xs : Array Int xs =

 initialize 3 identity  -- [0, 1, 2]

ys : Array Int ys =

 initialize 3 <| (+) 3  -- [3, 4, 5]

main = beginnerProgram { model = ()

                      , view = \_ -> toHtml (show (append xs ys))
                      , update = \_ _ -> ()
                      }

-- Array.fromList [0,1,2,3,4,5]</lang>

Emacs Lisp

The vconcat function returns a new array containing all the elements of it's arguments.

<lang lisp>(vconcat '[1 2 3] '[4 5] '[6 7 8 9]) => [1 2 3 4 5 6 7 8 9]</lang>

Erlang

In erlang, you can use the ++ operator or lists:append, which is implemented via ++.

On the shell, <lang erlang> 1> [1, 2, 3] ++ [4, 5, 6]. [1,2,3,4,5,6] 2> lists:append([1, 2, 3], [4, 5, 6]). [1,2,3,4,5,6] 3> </lang>

ERRE

<lang> PROGRAM ARRAY_CONCAT

DIM A[5],B[5],C[10]

! ! for rosettacode.org !

BEGIN

 DATA(1,2,3,4,5)
 DATA(6,7,8,9,0)
 FOR I=1 TO 5 DO  ! read array A[.]
   READ(A[I])
 END FOR
 FOR I=1 TO 5 DO  ! read array B[.]
   READ(B[I])
 END FOR
 FOR I=1 TO 10 DO ! append B[.] to A[.]
   IF I>5 THEN
      C[I]=B[I-5]
    ELSE
      C[I]=A[I]
   END IF
   PRINT(C[I];)   ! print single C value
 END FOR
 PRINT

END PROGRAM </lang>

Euphoria

<lang Euphoria>sequence s1,s2,s3 s1 = {1,2,3} s2 = {4,5,6} s3 = s1 & s2 ? s3</lang>

Output:
{1,2,3,4,5,6}

F#

Array concatenation. <lang fsharp>let a = [|1; 2; 3|] let b = [|4; 5; 6;|] let c = Array.append a b</lang> List concatenation (@ and List.append are equivalent). <lang fsharp>let x = [1; 2; 3] let y = [4; 5; 6] let z1 = x @ y let z2 = List.append x y</lang>

Factor

<lang factor>append</lang>

Example: <lang factor>( scratchpad ) USE: sequences ( scratchpad ) { 1 2 } { 3 4 } append . { 1 2 3 4 }</lang>

Fantom

In fansh:

<lang fantom> > a := [1,2,3] > b := [4,5,6] > a.addAll(b) > a [1,2,3,4,5,6] </lang>

Note 'addAll' is destructive. Write 'a.dup.addAll(b)' to create a fresh list.

FBSL

Array concatenation: <lang qbasic>#APPTYPE CONSOLE

DIM aint[] ={1, 2, 3}, astr[] ={"one", "two", "three"}, asng[] ={!1, !2, !3}

FOREACH DIM e IN ARRAYMERGE(aint, astr, asng) PRINT e, " "; NEXT

PAUSE</lang>

Output:
1 2 3 one two three 1.000000 2.000000 3.000000
Press any key to continue...

Forth

<lang Forth>: $!+ ( a u a' -- a'+u )

 2dup + >r swap move r> ;
cat ( a2 u2 a1 u1 -- a3 u1+u2 )
 align here dup >r $!+ $!+ r> tuck - dup allot ;

\ TEST create a1 1 , 2 , 3 , create a2 4 , 5 , a2 2 cells a1 3 cells cat dump

8018425F0: 01 00 00 00 00 00 00 00 - 02 00 00 00 00 00 00 00 ................ 801842600: 03 00 00 00 00 00 00 00 - 04 00 00 00 00 00 00 00 ................ 801842610: 05 00 00 00 00 00 00 00 - ........ </lang>

Fortran

Works with: Fortran version 90 and later

<lang fortran>program Concat_Arrays

 implicit none
 ! Note: in Fortran 90 you must use the old array delimiters (/ , /)
 integer, dimension(3) :: a = [1, 2, 3] ! (/1, 2, 3/)
 integer, dimension(3) :: b = [4, 5, 6] ! (/4, 5, 6/)
 integer, dimension(:), allocatable :: c, d
 
 allocate(c(size(a)+size(b)))
 c(1 : size(a)) = a
 c(size(a)+1 : size(a)+size(b)) = b
 print*, c
 ! alternative
 d = [a, b] ! (/a, b/)
 print*, d

end program Concat_Arrays</lang>

Free Pascal

Since FPC (Free Pascal compiler) version 3.2.0., the dynamic array concatenation operator + is available, provided {$modeSwitch arrayOperators+} (which is enabled by default in {$mode Delphi}). <lang pascal> array2 := array0 + array1</lang> Alternatively, one could use concat() which is independent of above modeswitch and mode: <lang pascal> array2 := concat(array0, array1);</lang> Both options do not require any libraries.

FreeBASIC

<lang freebasic> ' FB 1.05.0 Win64

Sub ConcatArrays(a() As String, b() As String, c() As String)

  Dim aSize As Integer = UBound(a) - LBound(a) + 1
  Dim bSize As Integer = UBound(b) - LBound(b) + 1
  Dim cSize As Integer = aSize + bSize
  Redim c(0 To cSize - 1)
  Dim i As Integer
  For i = 0 To aSize - 1
    c(i) = a(LBound(a) + i)
  Next
  For i = 0 To bSize - 1
    c(UBound(a) + i + 1) = b(LBound(b) + i)
  Next 

End Sub

Dim a(3) As String = {"The", "quick", "brown", "fox"} Dim b(4) As String = {"jumped", "over", "the", "lazy", "dog"} Dim c() As String ConcatArrays(a(), b(), c()) For i As Integer = LBound(c) To UBound(c)

 Print c(i); " ";

Next Print : Print Print "Press any key to quit the program" Sleep </lang>

Output:
The quick brown fox jumped over the lazy dog

Frink

<lang frink> a = [1,2] b = [3,4] a.pushAll[b] </lang>

FunL

<lang funl>arr1 = array( [1, 2, 3] ) arr2 = array( [4, 5, 6] ) arr3 = array( [7, 8, 9] )

println( arr1 + arr2 + arr3 )</lang>

Output:
ArraySeq(1, 2, 3, 4, 5, 6, 7, 8, 9)

Futhark

Array concatenation is done with the built-in function concat, which can take any number of arguments:

<lang Futhark> concat as bs cd </lang>

FutureBasic

<lang FutureBasic>void local fn DoIt

 CFArrayRef array = @[@"Alpha",@"Bravo",@"Charlie"]
 print array
 array = fn ArrayByAddingObjectsFromArray( array, @[@"Delta",@"Echo",@"FutureBasic"] )
 print array

end fn

window 1

fn DoIt

HandleEvents</lang> Output:

(
    Alpha,
    Bravo,
    Charlie
)
(
    Alpha,
    Bravo,
    Charlie,
    Delta,
    Echo,
    FutureBasic
)

Gambas

Click this link to run this code <lang gambas>Public Sub Main() Dim sString1 As String[] = ["The", "quick", "brown", "fox"] Dim sString2 As String[] = ["jumped", "over", "the", "lazy", "dog"]

sString1.Insert(sString2)

Print sString1.Join(" ")

End</lang> Output:

The quick brown fox jumped over the lazy dog

GAP

<lang gap># Concatenate arrays Concatenation([1, 2, 3], [4, 5, 6], [7, 8, 9]);

  1. [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
  1. Append to a variable

a := [1, 2, 3]; Append(a, [4, 5, 6); Append(a, [7, 8, 9]); a;

  1. [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]</lang>

Genie

<lang genie>[indent=4] /*

  Array concatenation, in Genie
  Tectonics: valac array-concat.gs
  • /

/* Creates a new array */ def int_array_concat(x:array of int, y:array of int):array of int

   var a = new Array of int(false, true, 0)  /* (zero-terminated, clear, size) */
   a.append_vals (x, x.length)
   a.append_vals (y, y.length)
   z:array of int = (owned) a.data
   return z

def int_show_array(a:array of int)

   for element in a do stdout.printf("%d ", element)
   stdout.printf("\n")

init

   x: array of int = {1, 2, 3}
   y: array of int = {3, 2, 1, 0, -1}
   z: array of int = int_array_concat(x, y)
   stdout.printf("x: "); int_show_array(x)
   stdout.printf("y: "); int_show_array(y)
   stdout.printf("z: "); int_show_array(z)
   print "%d elements in new array", z.length</lang>
Output:
prompt$ valac array-concat.gs
prompt$ ./array-concat
x: 1 2 3
y: 3 2 1 0 -1
z: 1 2 3 3 2 1 0 -1
8 elements in new array

GLSL

This macro concatenates two arrays to form a new array. The first parameter is the type of the array: <lang glsl>

  1. define array_concat(T,a1,a2,returned) \
   T[a1.length()+a2.length()] returned; \
   { \
   for(int i = 0; i < a1.length(); i++){ \
       returned[i] = a1[i]; \
   } \
   for(int i = 0; i < a2.length(); i++){ \
       returned[i+a1.length()] = a2[i]; \
   } \

} </lang> The macro can be used like this: <lang glsl> array_concat(float,float[](1.,2.,3.),float[](4.,5.,6.),returned); int i = returned.length(); </lang>

Go

<lang go>package main

import "fmt"

func main() {

   // Example 1:  Idiomatic in Go is use of the append function.
   // Elements must be of identical type.
   a := []int{1, 2, 3}
   b := []int{7, 12, 60} // these are technically slices, not arrays
   c := append(a, b...)
   fmt.Println(c)
   // Example 2:  Polymorphism.
   // interface{} is a type too, one that can reference values of any type.
   // This allows a sort of polymorphic list.
   i := []interface{}{1, 2, 3}
   j := []interface{}{"Crosby", "Stills", "Nash", "Young"}
   k := append(i, j...) // append will allocate as needed
   fmt.Println(k)
   // Example 3:  Arrays, not slices.
   // A word like "array" on RC often means "whatever array means in your
   // language."  In Go, the common role of "array" is usually filled by
   // Go slices, as in examples 1 and 2.  If by "array" you really mean
   // "Go array," then you have to do a little extra work.  The best
   // technique is almost always to create slices on the arrays and then
   // use the copy function.
   l := [...]int{1, 2, 3}
   m := [...]int{7, 12, 60} // arrays have constant size set at compile time
   var n [len(l) + len(m)]int
   copy(n[:], l[:]) // [:] creates a slice that references the entire array
   copy(n[len(l):], m[:])
   fmt.Println(n)

}</lang>

Output:
[1 2 3 7 12 60]
[1 2 3 Crosby Stills Nash Young]
[1 2 3 7 12 60]

Array concatenation needs can vary. Here is another set of examples that illustrate different techniques. <lang go>package main

import (

 "reflect"
 "fmt"

)

// Generic version // Easier to make the generic version accept any number of arguments, // and loop trough them. Otherwise there will be lots of code duplication. func ArrayConcat(arrays ...interface{}) interface{} {

 if len(arrays) == 0 {
   panic("Need at least one arguemnt")
 }
 var vals = make([]*reflect.SliceValue, len(arrays))
 var arrtype *reflect.SliceType
 var totalsize int
 for i,a := range arrays {
   v := reflect.NewValue(a)
   switch t := v.Type().(type) {
   case *reflect.SliceType:
     if arrtype == nil {
       arrtype = t
     } else if t != arrtype {
       panic("Unequal types")
     }
     vals[i] = v.(*reflect.SliceValue)
     totalsize += vals[i].Len()
   default: panic("not a slice")
   }
 }
 ret := reflect.MakeSlice(arrtype,totalsize,totalsize)
 targ := ret
 for _,v := range vals {
   reflect.Copy(targ, v)
   targ = targ.Slice(v.Len(),targ.Len())
 }
 return ret.Interface()

}

// Type specific version func ArrayConcatInts(a, b []int) []int {

 ret := make([]int, len(a) + len(b))
 copy(ret, a)
 copy(ret[len(a):], b)
 return ret

}

func main() {

 test1_a, test1_b := []int{1,2,3}, []int{4,5,6}
 test1_c := ArrayConcatInts(test1_a, test1_b)
 fmt.Println(test1_a, " + ", test1_b, " = ", test1_c)
 test2_a, test2_b := []string{"a","b","c"}, []string{"d","e","f"}
 test2_c := ArrayConcat(test2_a, test2_b).([]string)
 fmt.Println(test2_a, " + ", test2_b, " = ", test2_c)

}</lang>

Output:
[1 2 3]  +  [4 5 6]  =  [1 2 3 4 5 6]
[a b c]  +  [d e f]  =  [a b c d e f]

Gosu

<lang gosu> var listA = { 1, 2, 3 } var listB = { 4, 5, 6 }

var listC = listA.concat( listB )

print( listC ) // prints [1, 2, 3, 4, 5, 6] </lang>

Groovy

Solution: <lang groovy>def list = [1, 2, 3] + ["Crosby", "Stills", "Nash", "Young"]</lang>

Test: <lang groovy>println list</lang>

Output:
[1, 2, 3, Crosby, Stills, Nash, Young]

Haskell

A list is in Haskell one of the most common composite data types (constructed from other types). In the documentation we read for the append operation ++: <lang haskell>(++) :: [a] -> [a] -> [a]</lang>

Append two lists, i.e.:

 
[x1, ..., xm] ++ [y1, ..., yn] == [x1, ..., xm, y1, ..., yn]
[x1, ..., xm] ++ [y1, ...] == [x1, ..., xm, y1, ...]

If the first list is not finite, the result is the first list.

This operator could be defined from the scratch using explicit recursion: <lang haskell> [] ++ x = x (h:t) ++ y = h : (t ++ y) </lang> or folding <lang haskell> x ++ y = foldr (:) y x </lang>

HicEst

<lang HicEst>REAL :: a(7), b(3), c(10)

c = a DO i = 1, LEN(b)

  c(i + LEN(a)) = b(i)

ENDDO</lang>

Hy

<lang hy>=> (setv a [1 2 3]) => a [1, 2, 3]

=> (+ a [4 5 6]) ; returns the concatenation [1, 2, 3, 4, 5, 6] => a [1, 2, 3]

=> (.extend a [7 8 9]) ; modifies the list in place => a [1, 2, 3, 7, 8, 9]

=> (+ [1 2] [3 4] [5 6]) ; can accept multiple arguments [1, 2, 3, 4, 5, 6]</lang>

i

<lang i>main a $= [1, 2, 3] b $= [4, 5, 6]

print(a + b) }</lang>

Icon and Unicon

Both languages have list concatenation built in. Lists are fully dynamic arrays which can be truncated or extended at either end. <lang icon> procedure main()

   L1 := [1, 2, 3, 4]
   L2 := [11, 12, 13, 14]
   L3 := L1 ||| L2
   sep := ""
   every writes(sep, !L3) do
       sep := ", "
   write()

end </lang>

IDL

Array concatenation can mean different things, depending on the number of dimensions of the arguments and the result. In the simplest case, with 1-dimensional arrays to begin with, there are two obvious ways to concatenate them. If my arrays are these: <lang IDL>

> a = [1,2,3]
> b = [4,5,6]
> help,a
     A               INT       = Array[3]
> help,b
     B               INT       = Array[3]
> print,a
     1       2       3
> print,b
     4       5       6

</lang> Then they can be concatenated "at the ends": <lang IDL>

> help,[a,b]
     <Expression>    INT       = Array[6]
> print,[a,b]
      1       2       3       4       5       6

</lang> or "at the sides": <lang IDL>

> help,[[a],[b]]
     <Expression>    INT       = Array[3, 2]
> print,[[a],[b]]
      1       2       3
      4       5       6

</lang> Note that this requires that the arrays have the same size at the side at which they are concatenated: <lang IDL>

> b = transpose(b)
> help,b
     B               INT       = Array[1, 3]
> print,b
      4
      5
      6
> print,[a,b]
Unable to concatenate variables because the dimensions do not agree: B.
Execution halted at: $MAIN$          
> print,[[a],[b]]
Unable to concatenate variables because the dimensions do not agree: B.
Execution halted at: $MAIN$    

</lang> This can get a lot more complicated as a 3x4x5-element three-dimensional array can be concatenated with a 5x2x3-element array at exactly two "surfaces".

Idris

Idris will disambiguate functions based on type, so both List (arbitrary length) and Vect (fixed length) can be concatenated in the same way:

Idris> [1, 2] ++ [4, 5, 6]
[1, 2, 3, 4, 5] : List Integer
Idris> :module Data.Vect
*Data/Vect> (the (Vect 2 Nat) [1, 2]) ++ (the (Vect 3 Nat) [3, 4, 5])
[1, 2, 3, 4, 5] : Vect 5 Nat

Inform 7

<lang inform7>let A be {1, 2, 3}; let B be {4, 5, 6}; add B to A;</lang>

Ioke

<lang ioke>iik> [1,2,3] + [3,2,1] [1,2,3] + [3,2,1] +> [1, 2, 3, 3, 2, 1]</lang>

J

Solution: ,

Example: <lang j> array1 =: 1 2 3

  array2 =: 4 5 6
  array1 , array2

1 2 3 4 5 6</lang>

Of course, in J, array concatenation works (consistently) on arrays of any rank or dimension.

The verb , concatenates by treating the argument array with the largest number of dimensions as a list. Other primary verbs concatenate along other axes.

<lang j> ]ab=: 3 3 $ 'aaabbbccc' aaa bbb ccc

  ]wx=: 3 3 $ 'wxyz'

wxy zwx yzw

  ab , wx

aaa bbb ccc wxy zwx yzw

  ab ,. wx

aaawxy bbbzwx cccyzw

  ab ,: wx

aaa bbb ccc

wxy zwx yzw

  $ ab , wx    NB. applies to first (highest) axis

6 3

  $ ab ,. wx   NB. applies to last (atomic) axis

3 6

  $ ab ,: wx   NB. applies to new (higher) axis

2 3 3</lang>

Java

<lang java5>public static Object[] concat(Object[] arr1, Object[] arr2) {

   Object[] res = new Object[arr1.length + arr2.length];
   System.arraycopy(arr1, 0, res, 0, arr1.length);
   System.arraycopy(arr2, 0, res, arr1.length, arr2.length);
   return res;

}</lang>

JavaScript

The Array.concat() method returns a new array comprised of this array joined with other array(s) and/or value(s). <lang javascript>var a = [1,2,3],

   b = [4,5,6],
   c = a.concat(b); //=> [1,2,3,4,5,6]</lang>


Or, if we consider the concatenation of two arrays as a particular instance of the more general problem of concatenating 2 or more arrays, we can write a generic function:

Translation of: Haskell

See, for a function with an analogous type signature, concat in the Haskell Prelude.

<lang javascript>(function () {

   'use strict';
   // concat :: a -> [a]
   function concat(xs) {
       return [].concat.apply([], xs);
   }


  return concat(
     [["alpha", "beta", "gamma"], 
     ["delta", "epsilon", "zeta"], 
     ["eta", "theta", "iota"]]
 );

})();</lang>

Output:
["alpha", "beta", "gamma", "delta", "epsilon", "zeta", "eta", "theta", "iota"]

jq

If a and b are two arrays, then a+b is their concatenation. Similarly for a+b+c.

To concatenate the component arrays of an array, A, the add filter can be used: A|add

jq also supports streams, which are somewhat array-like, so it may be worth mentioning that the concatenation of two or more streams can be accomplished using "," instead of "+". <lang jq>[1,2] + [3] + [null] # => [1,2,3,null]

[range(1;3), 3, null] # => [1,2,3,null] </lang>

Julia

<lang julia>a = [1,2,3] b = [4,5,6] ab = [a;b]

  1. the above bracket notation simply generates a call to vcat

ab = vcat(a,b)

  1. hcat is short for `horizontal concatenation`

ab = hcat(a,b) #ab -> 3x2 matrix

  1. the append!(a,b) method is mutating, appending `b` to `a`

append!(a,b) # a now equals [1,2,3,4,5,6]</lang>

K

<lang K>

   a: 1 2 3
   b: 4 5 6
   a,b

1 2 3 4 5 6</lang>

Concatenations on larger dimensions also use ",", often combined with other operations.

<lang K>

  ab:3 3#"abcdefghi"

("abc"

"def"
"ghi")
  dd:3 3#"012345678"

("012"

"345"
"678")
  ab,dd   

("abc"

"def"
"ghi"
"012"
"345"
"678")
  +ab,dd   / flip (transpose) join

("adg036"

"beh147"
"cfi258")
  ab,'dd   / eachpair join

("abc012"

"def345"
"ghi678")
  +(+ab),dd

("abc036"

"def147"
"ghi258")</lang>

Klingphix

<lang Klingphix>include ..\Utilitys.tlhy

( 1.0 "Hello" 3 2 / 4 2.1 power ) ( 5 6 7 8 ) chain print

" " input</lang>

Output:
(1, "Hello", 1.5, 18.379173679952562, 5, 6, 7, 8)

Klong

<lang K>

   [1 2 3],[4 5 6]               :" join "

[1 2 3 4 5 6]

   [1 2],:\[[3 4] [5 6] [7 8]]   :" join each-left "

[[1 2 3 4] [1 2 5 6] [1 2 7 8]]

   [1 2],:/[[3 4] [5 6] [7 8]]   :" join each-right "

[[3 4 1 2] [5 6 1 2] [7 8 1 2]] </lang>

Kotlin

There is no operator or standard library function for concatenating Array types. One option is to convert to Collections, concatenate, and convert back: <lang kotlin>fun main(args: Array<String>) {

   val a: Array<Int> = arrayOf(1, 2, 3) // initialise a
   val b: Array<Int> = arrayOf(4, 5, 6) // initialise b
   val c: Array<Int> = (a.toList() + b.toList()).toTypedArray()
   println(c)

}</lang>

Alternatively, we can write our own concatenation function: <lang kotlin>fun arrayConcat(a: Array<Any>, b: Array<Any>): Array<Any> {

   return Array(a.size + b.size, { if (it in a.indices) a[it] else b[it - a.size] })

}</lang>

When working directly with Collections, we can simply use the + operator: <lang kotlin>fun main(args: Array<String>) {

   val a: Collection<Int> = listOf(1, 2, 3) // initialise a
   val b: Collection<Int> = listOf(4, 5, 6) // initialise b
   val c: Collection<Int> = a + b
   println(c)

}</lang>

LabVIEW

Use the Build Array function.
This image is a VI Snippet, an executable image of LabVIEW code. The LabVIEW version is shown on the top-right hand corner. You can download it, then drag-and-drop it onto the LabVIEW block diagram from a file browser, and it will appear as runnable, editable code.
 

Lambdatalk

<lang scheme> {def A {A.new 1 2 3 4 5 6}} -> [1,2,3,4,5,6] {def B {A.new 7 8 9}} -> [7,8,9] {A.concat {A} {B}} -> [1,2,3,4,5,6,7,8,9] </lang>

Lang5

<lang Lang5>[1 2] [3 4] append collapse .</lang>

langur

<lang langur>val .a = [1, 2, 3] val .b = [7, 8, 9] val .c = .a ~ .b writeln .c</lang>

Output:
[1, 2, 3, 7, 8, 9]

Lasso

<lang Lasso> local(arr1 = array(1, 2, 3)) local(arr2 = array(4, 5, 6)) local(arr3 = #arr1->asCopy) // make arr3 a copy of arr2

  1. arr3->merge(#arr2) // concatenate 2 arrays


Result:

arr1 = array(1, 2, 3) arr2 = array(4, 5, 6) arr3 = array(4, 5, 6) arr3 = array(1, 2, 3, 4, 5, 6)</lang>

LFE

<lang lisp> > (++ '(1 2 3) '(4 5 6)) (1 2 3 4 5 6) > (: lists append '(1 2 3) '(4 5 6)) (1 2 3 4 5 6) </lang>

Liberty BASIC

<lang lb> x=10

   y=20
   dim array1(x)
   dim array2(y)

[concatenate]

   dim array3(x + y)
   for i = 1 to x
       array3(i) = array1(i)
   next
   for i = 1 to y
       array3(i + x) = array2(i)
   next

[print]

   for i = 1 to x + y
       print array3(i)
   next</lang>

LIL

LIL uses lists instead of arrays. The builtin append command could be used as append a $b. That would add the entire list in variable b as one item to list a. Below quote is used to flatten the lists into a single new list of all items.

<lang tcl>##

 Array concatenation in LIL

set a [list 1 2 3] set b [list 4 5 6] set c [quote $a $b]

print $c print "[index $c 0] [index $c 3]"</lang>

Output:
prompt$ lil arrayConcatenation.lil
1 2 3 4 5 6
1 4

Limbo

<lang limbo>implement Command;

include "sys.m"; sys: Sys;

include "draw.m";

include "sh.m";

init(nil: ref Draw->Context, nil: list of string) { sys = load Sys Sys->PATH;

a := array[] of {1, 2}; b := array[] of {3, 4, 5};

c := array[len a + len b] of int; c[:] = a; c[len a:] = b;

for (i := 0; i < len c; i++) sys->print("%d\n", c[i]); }</lang>

Lingo

<lang lingo>a = [1,2] b = [3,4,5]

repeat with v in b

 a.append(v)

end repeat

put a -- [1, 2, 3, 4, 5]</lang>

Little

<lang C>void main() {

   int a[] = {0, 1, 2, 3, 4};
   int b[] = {5, 6, 7, 8, 9};
   int c[] = {(expand)a, (expand)b};
   puts(c);

}</lang>

COMBINE is used to combine lists or words. SENTENCE is used to combine lists and words into a single list. <lang logo> to combine-arrays :a1 :a2

 output listtoarray sentence arraytolist :a1 arraytolist :a2

end show combine-arrays {1 2 3} {4 5 6}  ; {1 2 3 4 5 6} </lang>

Lua

<lang lua>a = {1, 2, 3} b = {4, 5, 6}

for _, v in pairs(b) do

   table.insert(a, v)

end

print(table.concat(a, ", "))</lang>

Output:
1, 2, 3, 4, 5, 6

M2000 Interpreter

<lang M2000 Interpreter> a=(1,2,3,4,5) b=Cons(a, (6,7,8),a) Print b 1 2 3 4 5 6 7 8 1 2 3 4 5 </lang>

Adding 2 dimension arrays

<lang M2000 Interpreter> Dim Base 0, A(2,2)=1, B(1,2)=6 A()=Cons(A(), B(), A(), B()) \\ Restore the dimensions (without erasing items) Dim A(Dimension(A(),1)/2, 2) For I=0 to Dimension(A(),1)-1 {

     For j=0 to Dimension(A(),2)-1 {
           Print A(i, j),      
     }
     Print

} </lang>

Output:
    1    1
    1    1
    6    6
    1    1
    1    1
    6    6

Maple

There is a built-in procedure for concatenating arrays (and similar objects such as matrices or vectors). Arrays can be concatenated along any given dimension, which is specified as the first argument. <lang Maple> > A := Array( [ 1, 2, 3 ] );

                            A := [1, 2, 3]

> B := Vector['row']( [ sin( x ), cos( x ), tan( x ) ] );

                    B := [sin(x), cos(x), tan(x)]

> ArrayTools:-Concatenate( 1, A, B ); # stack vertically

                     [  1         2         3   ]
                     [                          ]
                     [sin(x)    cos(x)    tan(x)]

> ArrayTools:-Concatenate( 2, A, B ); # stack horizontally

                  [1, 2, 3, sin(x), cos(x), tan(x)]

> M := << a, b, c ; d, e, f >>; # a matrix

                               [a    b    c]
                          M := [           ]
                               [d    e    f]

> ArrayTools:-Concatenate( 1, M, A );

                            [a    b    c]
                            [           ]
                            [d    e    f]
                            [           ]
                            [1    2    3]

</lang> Of course, the order of the arguments is important. <lang Maple> > ArrayTools:-Concatenate( 1, A, M );

                            [1    2    3]
                            [           ]
                            [a    b    c]
                            [           ]
                            [d    e    f]

</lang> Lists, in Maple, might be considered to be a kind of "array" (in the sense that they look like arrays in memory), though they are actually immutable objects. However, they can be concatenated as follows. <lang Maple> > L1 := [ 1, 2, 3 ];

                           L1 := [1, 2, 3]

> L2 := [ a, b, c ];

                           L2 := [a, b, c]

> [ op( L1 ), op( L2 ) ];

                          [1, 2, 3, a, b, c]

> [ L1[], L2[] ]; # equivalent, just different syntax

                          [1, 2, 3, a, b, c]

</lang>

Mathcad

Ref: [1] Mathcad Community Topic


Mathcad has a built-in array type that includes a natural 2D matrix-style format. Mathcad can concatenate arrays in several ways. The easiest way is to use the built-in stack and augment functions.


stack concatenates arrays row-wise. The two (or more) arrays must have the same number of columns, and the resulting array row count is equal to the total number of rows in the stacked arrays.


augment concatenates arrays column-wise. The two (or more) arrays must have the same number of rows, and the resulting array column count is equal to the total number of columns in the augmented arrays.

<lang Mathcad> create a pair of arbitrary array:

   a:=matrix(2,2,max) b:=a+3
   
   a=|0 1|   b=|3 4|
     |1 1|     |4 4|

concatentate them vertically:

                |0 1|
   stack(a,b) = |1 1|
                |3 4|
                |4 4|
   augment(a,b) = |0 1 3 4|
                  |1 1 3 4|

</lang>

Mathematica / Wolfram Language

<lang Mathematica>Join[{1,2,3}, {4,5,6}]

-> {1, 2, 3, 4, 5, 6}</lang>

MATLAB / Octave

Two arrays are concatenated by placing the two arrays between a pair of square brackets. A space between the two array names will concatenate them horizontally, and a semi-colon between array names will concatenate vertically. <lang MATLAB>>> a = [1 2 3]; >> b = [4 5 6]; >> c = [a b] c =

    1     2     3     4     5     6

>> c = [a;b] c =

    1     2     3
    4     5     6</lang>

For concatenation along higher dimensions, use cat(): <lang MATLAB>>> a = randn([3 4 5]); >> b = randn([3 4 7]); >> c = cat(3,a,b); >> size(c)

  ans =
   3    4   12</lang>

Maxima

<lang>u: [1, 2, 3, 4]$ v: [5, 6, 7, 8, 9, 10]$ append(u, v); /* [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] */

/* There are also functions for matrices */

a: matrix([6, 1, 8],

         [7, 5, 3],
         [2, 9, 4])$

addcol(a, ident(3)); /* matrix([6, 1, 8, 1, 0, 0],

         [7, 5, 3, 0, 1, 0],
         [2, 9, 4, 0, 0, 1]) */

addrow(a, ident(3)); /* matrix([6, 1, 8],

         [7, 5, 3],
         [2, 9, 4],
         [1, 0, 0],
         [0, 1, 0],
         [0, 0, 1]) */</lang>

Mercury

<lang Mercury>A `append` B = C</lang>

It could be "as simple as array1 + array2", but the 'array' module names the operation 'append' rather than '+'. It's tempting to just say that Mercury supports ad-hoc polymorphism - it can infer that a bare '+' refers to 'float.+' or 'int.+' (or that the 'append' above is array.append, rather than list.append), by the types involved - but it also handles other ambiguities in the same way. For instance, Mercury (like Prolog and Erlang) treats the arity of a function as part of its name, where a(1, 2) and a(1) involve the distinct functions a/2 and a/1. But Mercury also (unlike Prolog and Erlang) supports currying, where a(1) is a function that accepts a/2's second argument. So, is [a(X), a(Y), a(Z)] a list of whatever type a/1 evaluates to, or is it a list of curried a/2?

min

Works with: min version 0.19.3

<lang min>(1 2 3) (4 "apple" 6) concat print</lang>

Output:
(1 2 3 4 "apple" 6)

MiniScript

<lang MiniScript> arrOne = [1, 2, 3] arrTwo = [4, 5, 6] print arrOne + arrTwo </lang>

Nanoquery

Assuming a and b are array or list objects, they may concatenated using the '+' operator. <lang Nanoquery>a + b</lang> The '*' operator may also be used to create a specific number of copies of a list or array.

% a = list()
% append a "a" "b" "c"
% println a
[a, b, c]
% println a * 5
[a, b, c, a, b, c, a, b, c, a, b, c, a, b, c]

Neko

<lang ActionScript>/*

Array concatenation, in Neko
  • /

var a1 = $array(1,2,3,4) var a2 = $array("abc", "def")

/* $array(a1, a2) creates an array of two arrays, $aconcat merges to one */ var ac = $aconcat($array(a1, a2)) $print(ac, "\n")</lang>

Output:
prompt$ nekoc array-concatenation.neko
prompt$ neko array-concatenation.n
[1,2,3,4,abc,def]

Nemerle

<lang Nemerle>using System.Console; using Nemerle.Collections;

module ArrayCat {

   Main() : void
   {
       def arr1 = array[1, 2, 3]; def arr2 = array[4, 5, 6];
       def arr12 = arr1.Append(arr2);                       // <----
       foreach (i in arr12) Write($"$i  ");
   }

}</lang>

NetRexx

NetRexx arrays are identical to Java's so all the techniques described in the Java section apply to NetRexx too. This example uses the Collection classes to merge two arrays. <lang netrexx>/* NetRexx */ options replace format comments java crossref nobinary

cymru = [ 'Ogof Ffynnon Ddu', 'Ogof Draenen' ]

dlm = '-'.copies(40)

say dlm loop c_ = 0 to cymru.length - 1

 say c_ cymru[c_]
 end c_

yorks = [ 'Malham Tarn Pot', 'Greygill Hole' ]

say dlm loop y_ = 0 to yorks.length - 1

 say y_ yorks[y_]
 end y_

merge = ArrayList() merge.addAll(Arrays.asList(cymru)) merge.addAll(Arrays.asList(yorks))

say dlm merged = merge.toArray() loop m_ = 0 to merged.length - 1

 say m_ merged[m_]
 end m_</lang>
Output:
---------------------------------------- 
0 Ogof Ffynnon Ddu 
1 Ogof Draenen 
---------------------------------------- 
0 Malham Tarn Pot 
1 Greygill Hole 
---------------------------------------- 
0 Ogof Ffynnon Ddu 
1 Ogof Draenen 
2 Malham Tarn Pot 
3 Greygill Hole 

NewLISP

<lang NewLISP>; file: arraycon.lsp

url
http://rosettacode.org/wiki/Array_concatenation
author
oofoe 2012-01-28

(println "Append lists: " (append '(3 a 5 3) (sequence 1 9)))

(println "Multi append: "

        (append '(this is)
                '(a test)
                '(of the emergency)
                (sequence 3 1)))

(println "Append arrays: "

        (append '((x 56) (b 99)) '((z 34) (c 23) (r 88))))

(exit)</lang>

Output:
Append lists:  (3 a 5 3 1 2 3 4 5 6 7 8 9)
Multi append:  (this is a test of the emergency 3 2 1)
Append arrays: ((x 56) (b 99) (z 34) (c 23) (r 88))

Nial

Examples tested to work with Q'Nial7

<lang Nial> a:= 1 2 3 +-+-+-+ |1|2|3| +-+-+-+

   b:= 4 5 6

+-+-+-+ |4|5|6| +-+-+-+</lang>

Table of lists:

<lang Nial> a b

+-------+-------+ |+-+-+-+|+-+-+-+| ||1|2|3|||4|5|6|| |+-+-+-+|+-+-+-+| +-------+-------+</lang>

Simple concatenation of two arrays/lists:

<lang Nial> link a b +-+-+-+-+-+-+ |1|2|3|4|5|6| +-+-+-+-+-+-+</lang>

Convert list of lists to table:

<lang Nial> mix a b +-+-+-+ |1|2|3| +-+-+-+ |4|5|6| +-+-+-+</lang>

Interchange levels of a list of lists: <lang Nial> pack a b +-----+-----+-----+ |+-+-+|+-+-+|+-+-+| ||1|4|||2|5|||3|6|| |+-+-+|+-+-+|+-+-+| +-----+-----+-----+</lang>

Nim

Dynamic sized Sequences can simply be concatenated: <lang nim>var

 x = @[1,2,3,4,5,6]
 y = @[7,8,9,10,11]
 z = x & y</lang>

Static sized Arrays: <lang nim>var

 a = [1,2,3,4,5,6]
 b = [7,8,9,10,11]
 c: array[11, int]

c[0..5] = a c[6..10] = b</lang>

Oberon-2

<lang oberon2> MODULE ArrayConcat; IMPORT

 Out;

TYPE

 IntArray = POINTER TO ARRAY OF INTEGER;

VAR

 x, y, z: IntArray;
 
 PROCEDURE InitArray(VAR x: IntArray;from: INTEGER);
 VAR
   i: LONGINT;
 BEGIN
   FOR i := 0 TO LEN(x^) - 1 DO
     x[i] := from;
     INC(from)
   END
 END InitArray;
 
 PROCEDURE Concat(x,y: IntArray; VAR z: IntArray);
 VAR
   i: LONGINT;
 BEGIN
   ASSERT(LEN(x^) + LEN(y^) <= LEN(z^));
   FOR i := 0 TO LEN(x^) - 1 DO z[i] := x[i] END;
   FOR i := 0 TO LEN(y^) - 1 DO z[i + LEN(x^)] := y[i] END
 END Concat;
 PROCEDURE Show(x: IntArray);
 VAR
   i: INTEGER;
 BEGIN
   i := 0;
   Out.Char('[');
   WHILE (i < LEN(x^)) DO
     Out.LongInt(x[i],3);IF i < LEN(x^) - 1 THEN Out.Char(',') END;
     INC(i)
   END;
   Out.Char(']');Out.Ln
 END Show;
 

BEGIN

 (* Standard types *)
 NEW(x,5);InitArray(x,1);
 NEW(y,10);InitArray(y,6);
 NEW(z,LEN(x^) + LEN(y^));
 
 Concat(x,y,z);
 Show(z)
 

END ArrayConcat. </lang>

Output:
[  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15]

Objeck

<lang objeck> bundle Default {

 class Arithmetic {
    function : Main(args : String[]) ~ Nil {
      array1 := [3, 5, 7];
      array2 := [2, 4, 6];
     
      array3 := Copy(array1, array2);
      each(i : array3) {
        array3[i]->PrintLine();
      };
 }
 
 function : native : Copy(array1 : Int[], array2 : Int[]) ~ Int[] {
    max := array1->Size() + array2->Size();
    array3 := Int->New[max];
     
    i := 0;
    for(i := i; i < array1->Size(); i += 1;) {
      array3[i] := array1[i];
    };
     
    j := 0;
    for(i := i; i < max; i += 1;) {
      array3[i] := array2[j];
      j += 1;
    };
     
     return array3;
   }
 }

} </lang>

Objective-C

with immutable arrays: <lang objc>NSArray *arr1 = @[@1, @2, @3]; NSArray *arr2 = @[@4, @5, @6]; NSArray *arr3 = [arr1 arrayByAddingObjectsFromArray:arr2];</lang>

or adding onto a mutable array: <lang objc>NSArray *arr1 = @[@1, @2, @3]; NSArray *arr2 = @[@4, @5, @6]; NSMutableArray *arr3 = [NSMutableArray arrayWithArray:arr1]; [arr3 addObjectsFromArray:arr2];</lang>

OCaml

It is more natural in OCaml to use lists instead of arrays: <lang ocaml># let list1 = [1; 2; 3];; val list1 : int list = [1; 2; 3]

  1. let list2 = [4; 5; 6];;

val list2 : int list = [4; 5; 6]

  1. let list1and2 = list1 @ list2;;

val list1and2 : int list = [1; 2; 3; 4; 5; 6]</lang>

If you want to use arrays: <lang ocaml># let array1 = [|1; 2; 3|];; val array1 : int array = [|1; 2; 3|]

  1. let array2 = [|4; 5; 6|];;

val array2 : int array = [|4; 5; 6|]

  1. let array1and2 = Array.append array1 array2;;

val array1and2 : int array = [|1; 2; 3; 4; 5; 6|]</lang>

Oforth

<lang Oforth>import: mapping

[1, 2, 3 ] [ 4, 5, 6, 7 ] + </lang>

Onyx

<lang onyx># With two arrays on the stack, cat pops

  1. them, concatenates them, and pushes the result back
  2. on the stack. This works with arrays of integers,
  3. strings, or whatever. For example,

[1 2 3] [4 5 6] cat # result: [1 2 3 4 5 6] [`abc' `def'] [`ghi' `jkl'] cat # result: [`abc' `def' `ghi' `jkl']

  1. To concatenate more than two arrays, push the number of arrays
  2. to concatenate onto the stack and use ncat. For example,

[1 true `a'] [2 false `b'] [`3rd array'] 3 ncat

  1. leaves [1 true `a' 2 false `b' `3rd array'] on the stack</lang>

ooRexx

<lang ooRexx>a = .array~of(1,2,3) say "Array a has " a~items "items" b = .array~of(4,5,6) say "Array b has " b~items "items" a~appendall(b) -- adds all items from b to a say "Array a now has " a~items "items"</lang>

Output:
Array a has  3 items
Array b has  3 items
Array a now has  6 items

Order

Order supports two main aggregate types: tuples and sequences (similar to lists in other languages). Most "interesting" operations are limited to sequences, but both support an append operation, and each can be converted to the other. <lang c>#include <order/interpreter.h>

ORDER_PP( 8tuple_append(8tuple(1, 2, 3), 8tuple(4, 5, 6), 8pair(7, 8)) ) // -> (1,2,3,4,5,6,7,8)

ORDER_PP( 8seq_append(8seq(1, 2, 3), 8seq(4, 5, 6), 8seq(7, 8)) ) // -> (1)(2)(3)(4)(5)(6)(7)(8)</lang>

OxygenBasic

<lang oxygenbasic> 'CREATE DYNAMIC ARRAY SPACES USING STRINGS

string sa=nuls 5* sizeof float string sb=sa

'MAP ARRAY VARIABLES ONTO STRINGS

float a at *sa float b at *sb

'ASSIGN SOME VALUES

a<=10,20,30,40,50 b<=60,70,80,90,00

'ADD ARRAY B TO A BY STRING CONCATENATION

sa+=sb

'TEST

print a[7] 'result 70 </lang>

Oz

List are concatenated with List.append (shortcut: Append). Tuples are concatened with Tuple.append. Arrays do exist in Oz, but are rarely used. <lang oz>%% concatenating 2 lists {Append [a b] [c d]} = [a b c d]

%% concatenating 2 tuples {Tuple.append t(1 2 3) u(4 5 6)} = u(1 2 3 4 5 6)</lang>

PARI/GP

<lang parigp>concat(u,v)</lang>

Pascal

See Delphi and Free Pascal

Perl

In Perl, arrays placed into list context are flattened: <lang perl>my @arr1 = (1, 2, 3); my @arr2 = (4, 5, 6); my @arr3 = (@arr1, @arr2);</lang>

The push function appends elements onto an existing array: <lang perl>my @arr1 = (1, 2, 3); my @arr2 = (4, 5, 6); push @arr1, @arr2; print "@arr1\n"; # prints "1 2 3 4 5 6"</lang>

Phix

Library: Phix/basics
sequence s1 = {1,2,3}, s2 = {4,5,6}
? s1 & s2
Output:
 {1,2,3,4,5,6}

Phixmonti

<lang Phixmonti>1.0 "Hello" 3 2 / 4 2.1 power 4 tolist 5 6 7 8 4 tolist chain print</lang> With syntactic sugar <lang Phixmonti>include ..\Utilitys.pmt ( 1.0 "Hello" 3 2 / 4 2.1 power ) ( 5 6 7 8 ) chain print</lang>

PHP

<lang php>$arr1 = array(1, 2, 3); $arr2 = array(4, 5, 6); $arr3 = array_merge($arr1, $arr2);</lang>

Picat

Picat has support for both lists and arrays and arrays can be much faster. Some list functions works with both lists and arrays, but some doesn't, e.g. append/3. In those cases one have to convert arrays to a list with to_list/1, and back again with to_array/1.

<lang Picat>go =>

  L1 = {1,2,3,4,5}, % define an array with {}
  L2 = {6,7,8,9},
  % The built-in array/list concatenation
  println(L1 ++ L2),
  % Using the built-in append/3 works only on lists
  % so the arrays must be converted to lists.
  append(L1.to_list,L2.to_list,L3),
  println(L3.to_array),
  nl.</lang>
Output:
{1,2,3,4,5,6,7,8,9}
{1,2,3,4,5,6,7,8,9}

PicoLisp

PicoLisp has no built-in array data type. Lists are used instead.

There are destructive concatenations: <lang PicoLisp>: (setq A (1 2 3) B '(a b c)) -> (a b c)

(conc A B) # Concatenate lists in 'A' and 'B'

-> (1 2 3 a b c)

A

-> (1 2 3 a b c) # Side effect: List in 'A' is modified!</lang> and non-destructive concatenations: <lang PicoLisp>: (setq A (1 2 3) B '(a b c)) -> (a b c)

(append A B) # Append lists in 'A' and 'B'

-> (1 2 3 a b c)

A

-> (1 2 3)

B

-> (a b c) # Arguments are not modified</lang>

Pike

<lang Pike>int main() { array arr1 = ({1, 2, 3}); array arr2 = ({4, 5, 6}); array arr3 = arr1 + arr2; }</lang>

PL/I

Trivial example requires no computational statement. Note that the arrays are not in static storage: <lang PL/I>

  declare x(12) fixed;
  declare b(5) fixed defined x;
  declare c(7) fixed defined x(1sub+5);

</lang> A more general example using dynamic bounds. Again, no computation statement is required. <lang>

  declare x(m+n) fixed;
  declare b(m) fixed defined x;
  declare c(n) fixed defined x(1sub+hbound(b,1));

</lang>

An alternative, that can be used to advantage for matrices as well as vectors, follows. This example illustrates extending a matrix diagonally. Although fixed array bounds are used in the declarations, the bounds can be dynamic. Matrix B is extended by placing matrix C on its diagonal: <lang>

  declare a(5,6) fixed;
  declare b(3,4) fixed defined a(1sub, 2sub);
  declare c(2,2) fixed defined a(1sub+hbound(b,1), 2sub+hbound(b,2));
  declare (i, j, k) fixed;
  a = 0;
  put skip list ('Please type elements for a 3 x 4 matrix:');
  get list (b);
  put skip list ('Please type elements for a 2 x 2 matrix:');
  get list (c);
  put skip edit (c) ( skip, (hbound(c,2)) f(5,0) );
  put skip list ('Composite matrix:');
  put skip edit (a) ( skip, (hbound(a,2)) f(5,0) );

</lang>

Output:

<lang> Please type elements for a 3 x 4 matrix:

Please type elements for a 2 x 2 matrix:

  13   14
  15   16

Composite matrix:

   1    2    3    4    0    0
   5    6    7    8    0    0
   9   10   11   12    0    0
   0    0    0    0   13   14
   0    0    0    0   15   16

</lang>

Pony

<lang pony> actor Main

   new create(env:Env)=>
       var a:Array[I32]=Array[I32](4)
       var b:Array[I32]=Array[I32](2)
       a.push(1)
       a.push(2)
       a.push(3)
       a.push(4)
       b.push(5)
       b.push(6)
       a.concat(b.values())
       for i in a.values() do
           env.out.print(i.string())
       end

</lang>

PostScript

Library: initlib

<lang postscript> [1 2 3 4] [5 6 7 8] concat </lang>

PowerShell

<lang powershell>$a = 1,2,3 $b = 4,5,6

$c = $a + $b Write-Host $c</lang>

Processing

<lang processing> int[] a = {1, 2, 3}, b = {4, 5, 6};

int[] c = concat(a, b); </lang>

Prolog

<lang prolog> ?- append([1,2,3],[4,5,6],R). R = [1, 2, 3, 4, 5, 6]. </lang>

PureBasic

<lang PureBasic>Procedure displayArray(Array a(1), msg.s)

 Protected i
 Print(msg + " [")
 For i = 0 To ArraySize(a())
   Print(Str(a(i)))
   If i <> ArraySize(a())
     Print(", ")
   EndIf 
 Next 
 PrintN("]")

EndProcedure

Procedure randomElements(Array a(1), lo, hi)

 Protected i
 For i = 0 To ArraySize(a())
   a(i) = random(hi - lo) + lo
 Next 

EndProcedure

Procedure arrayConcat(Array a(1), Array b(1), Array c(1))

 Protected i, newSize = ArraySize(a()) + ArraySize(b()) + 1
 Dim c(newSize)
 For i = 0 To ArraySize(a())
   c(i) = a(i)
 Next
 For i = 0 To ArraySize(b())
   c(i + ArraySize(a()) + 1) = b(i)
 Next

EndProcedure


If OpenConsole()

 Dim a(random(3) + 1)
 Dim b(random(3) + 1)
 Dim c(0) ;array will be resized by arrayConcat()
 
 randomElements(a(), -5, 5)
 randomElements(b(), -5, 5)
 displayArray(a(), "a:")
 displayArray(b(), "b:")
 arrayConcat(a(), b(), c())
 displayArray(c(), "concat of a[] + b[]:")
 
 Print(#CRLF$ + #CRLF$ + "Press ENTER to exit")
 Input()
 CloseConsole()

EndIf</lang>

Output:
a: [5, 2, -4, -1, -2]
b: [0, -4, -1]
concat of a[] + b[]: [5, 2, -4, -1, -2, 0, -4, -1]

Python

The + operator concatenates two lists and returns a new list. The list.extend method appends elements of another list to the receiver. <lang python>arr1 = [1, 2, 3] arr2 = [4, 5, 6] arr3 = [7, 8, 9] arr4 = arr1 + arr2 assert arr4 == [1, 2, 3, 4, 5, 6] arr4.extend(arr3) assert arr4 == [1, 2, 3, 4, 5, 6, 7, 8, 9]</lang>

Note: list.extend is normally accomplished using the += operator like this: <lang python>arr5 = [4, 5, 6] arr6 = [7, 8, 9] arr6 += arr5 assert arr6 == [7, 8, 9, 4, 5, 6]</lang>

Q

<lang q>list1:1 2 3 list2:4 5 6 list1,list2</lang>


QBasic

Works with: QBasic version 1.1
Works with: QuickBasic version 4.5

<lang qbasic>FUNCTION ConcatArrays(a(), b()) ta = UBOUND(a) tb = UBOUND(b)

nt = ta + tb

FOR i = ta + 1 TO nt a(i) = b(i - ta) NEXT i

ConcatArrays = nt END FUNCTION

dimen = 5 DIM a(dimen) DIM b(dimen)

FOR i = 1 TO dimen a(i) = i b(i) = i + dimen NEXT i

nt = ConcatArrays(a(), b())

FOR i = 1 TO nt PRINT a(i); IF i < nt THEN PRINT ", "; NEXT i </lang>

QB64

<lang QB64>

Dim As Integer First, Second First = 5: Second = 8

Dim As Integer Array1(1 To First), Array2(1 To Second), ArrayResult(1 To First + Second)


Init Array1(), 2 Print "First array" ShowArr Array1() Sleep 2 Print "Second array" Init Array2(), 5 ShowArr Array2() Sleep 2 Print "Final array"

ConcatArray Array1(), Array2(), ArrayResult() ShowArr ArrayResult() End

Sub Init (A() As Integer, R As Integer)

   Dim Index As Integer
   For Index = 1 To UBound(a)
       A(Index) = Index * R
   Next

End Sub

Sub ShowArr (A() As Integer)

   Dim Index As Integer
   For Index = 1 To UBound(a)
       Print A(Index)
   Next

End Sub

Sub ConcatArray (A() As Integer, B() As Integer, R() As Integer)

   Dim Index As Integer
   For Index = 1 To UBound(a)
       R(Index) = A(Index)
   Next
   For Index = (1) To (UBound(b))
       R(Index + UBound(a)) = B(Index)
   Next

End Sub

</lang>

Quackery

The word join joins two nests.

Illustrated with a dialogue in the Quackery shell. (REPL)

> quackery

Welcome to Quackery.

Enter "leave" to leave the shell.

/O> ' [ [ 1 2 ] [ 3 4 ] [ 5 6 ] ] 
... ' [ [ 7 8 ] [ 9 0 ] ] join echo
... 
[ [ 1 2 ] [ 3 4 ] [ 5 6 ] [ 7 8 ] [ 9 0 ] ]
Stack empty.

/O> leave
... 

Goodbye.

R

<lang R> a1 <- c(1, 2, 3) a2 <- c(3, 4, 5) a3 <- c(a1, a2) </lang>

Racket

<lang racket> (vector-append #(1 2 3 4) #(5 6 7) #(8 9 10)) </lang>

Output:
'#(1 2 3 4 5 6 7 8 9 10)

Raku

(formerly Perl 6)

Works with: Rakudo version 2018.06

<lang perl6>my @array1 = 1, 2, 3; my @array2 = 4, 5, 6;

  1. If you want to concatenate two array to form a third,
  2. either use the slip operator "|", to flatten each array.

my @array3 = |@array1, |@array2; say @array3;

  1. or just flatten both arrays in one fell swoop

@array3 = flat @array1, @array2; say @array3;

  1. On the other hand, if you just want to add the elements
  2. of the second array to the first, use the .append method.

say @array1.append: @array2;</lang>

Output:
[1 2 3 4 5 6]
[1 2 3 4 5 6]
[1 2 3 4 5 6]

RapidQ

<lang vb> DEFINT A(1 to 4) = {1, 2, 3, 4} DEFINT B(1 to 4) = {10, 20, 30, 40}

'Append array B to array A Redim A(1 to 8) as integer MEMCPY(varptr(A(5)), varptr(B(1)), Sizeof(integer)*4) </lang>

REBOL

<lang REBOL> a1: [1 2 3] a2: [4 5 6] a3: [7 8 9]

append a1 a2 ; -> [1 2 3 4 5 6]

append/only a1 a3 ; -> [1 2 3 4 5 6 [7 8 9]] </lang>

Red

<lang Red>>> arr1: ["a" "b" "c"] >> arr2: ["d" "e" "f"] >> append arr1 arr2 == ["a" "b" "c" "d" "e" "f"] >> arr3: [1 2 3] >> insert arr1 arr3 >> arr1 == [1 2 3 "a" "b" "c" "d" "e" "f"] >> arr4: [22 33 44] == [22 33 44] >> append/only arr1 arr4 == [1 2 3 "a" "b" "c" "d" "e" "f" [22 33 44]]</lang>

ReScript

<lang ReScript>Js.Array2.concat(["a", "b"], ["c", "d", "e"]) == ["a", "b", "c", "d", "e"]</lang>

Retro

<lang Retro>{ #1 #2 #3 } { #4 #5 #6 } a:append</lang>

REXX

REXX doesn't have arrays as such, but it has something that looks, feels, and tastes like arrays:

  • stemmed variables

Simply, a stemmed array is a variable with an appended dot (.) followed by a symbol (it's normally an integer or an alphanumeric name).

There is no way to preallocate a stemmed variable, REXX just assigns them as they are created (assigned a value).

As such, there isn't an easy way to keep track of the number of "elements" in a REXX "array"   (unless the programmer maintains a list).

Consider: <lang rexx>a.1 = 10 a.2 = 22.7 a.7 = -12</lang> where now we have three "elements", and they are disjointed (another word for sparse).
There are ways to handle this in REXX however.

When assigning stemmed arrays, it is common to assign "element" zero to the number of values,
assuming that the stemmed variables are sequential.

example: <lang rexx>fact.0=8 fact.1= 1 fact.2= 2 fact.3= 6 fact.4= 24 fact.5= 120 fact.6= 720 fact.7= 5040 fact.8=40320</lang> To concat two "arrays" in REXX, the following assumes that the stemmed variables are in order, with no gaps, and none have a "null" value. <lang rexx>/*REXX program to demonstrates how to perform array concatenation.*/

p.= /*(below) a short list of primes.*/ p.1=2; p.2=3; p.3=5; p.4=7; p.5=11; p.6=13 p.7=17; p.8=19; p.9=23; p.10=27; p.11=31; p.12=37

f.= /*(below) a list of Fibonacci #s.*/ f.0=0;f.1=1;f.2=1;f.3=2;f.4=3;f.5=5;f.6=8;f.7=13;f.8=21;f.9=34;f.10=55

            do j=1  while p.j\==
            c.j=p.j                   /*assign C array with some primes*/
            end   /*j*/

n=j-1

            do k=0  while f.k\==;   n=n+1
            c.n=f.k                   /*assign C array with fib numbers*/
            end   /*k*/

say 'elements=' n say

            do m=1  for n              
            say 'c.'m"="c.m           /*show a "merged"  C  array nums.*/   
            end   /*m*/
                                      /*stick a fork in it, we're done.*/</lang>
Output:
elements= 23

c.1=2
c.2=3
c.3=5
c.4=7
c.5=11
c.6=13
c.7=17
c.8=19
c.9=23
c.10=27
c.11=31
c.12=37
c.13=0
c.14=1
c.15=1
c.16=2
c.17=3
c.18=5
c.19=8
c.20=13
c.21=21
c.22=34
c.23=55

Ring

<lang ring> arr1 = [1, 2, 3] arr2 = [4, 5, 6] arr3 = [7, 8, 9] arr4 = arr1 + arr2 see arr4 see nl arr5 = arr4 + arr3 see arr5 </lang>

RLaB

In RLaB the matrices can be appended (column-wise) or stacked (row-wise). Consider few examples: <lang RLaB> >> x = [1, 2, 3] >> y = [4, 5, 6] // appending matrix 'y' on the right from matrix 'x' is possible if the two matrices have // the same number of rows: >> z1 = [x, y] matrix columns 1 thru 6

          1             2             3             4             5             6

// stacking matrix 'y' below the matrix 'x' is possible if the two matrices have // the same number of columns: >> z2 = [x; y]

          1             2             3
          4             5             6

>> </lang>

Ruby

The Array#+ method concatenates two arrays and returns a new array. The Array#concat method appends elements of another array to the receiver. <lang ruby>arr1 = [1, 2, 3] arr2 = [4, 5, 6] arr3 = [7, 8, 9] arr4 = arr1 + arr2 # => [1, 2, 3, 4, 5, 6] arr4.concat(arr3) # => [1, 2, 3, 4, 5, 6, 7, 8, 9]</lang>

Or use flatten(1): <lang ruby>

  1. concat multiple arrays:

[arr1,arr2,arr3].flatten(1)

  1. ignore nil:

[arr1,arr2,arr3].compact.flatten(1) </lang>

Rust

<lang rust>fn main() {

   let a_vec = vec![1, 2, 3, 4, 5];
   let b_vec = vec![6; 5];
   let c_vec = concatenate_arrays(&a_vec, &b_vec);
   println!("{:?} ~ {:?} => {:?}", a_vec, b_vec, c_vec);

}

fn concatenate_arrays<T: Clone>(x: &[T], y: &[T]) -> Vec<T> {

   let mut concat = x.to_vec();
   concat.extend_from_slice(y);
   concat

} </lang>

Or, with iterators:

<lang rust>fn concatenate_arrays<T: Clone>(x: &[T], y: &[T]) -> Vec<T> {

   x.iter().chain(y).cloned().collect()

} </lang>

S-lang

<lang S-lang>variable a = [1, 2, 3]; variable b = [4, 5, 6], c;</lang>

a+b is perfectly valid in S-Lang, but instead of the problem's desired effect, it gives you a new array with each coorresponding element from a and b added. But because arrays automatically 'flatten' when defined, concatenation is as simple as: <lang S-lang>c = [a, b];</lang> Use of lists is more traditional; lists don't 'flatten', so we use either list_concat() to create a new concatenated array: <lang S-lang>a = {1, 2, 3}; b = {4, 5, 6}; c = list_concat(a, b);</lang>

or list_join(): <lang S-lang>list_join(a, b);</lang> which adds the elements of b onto a.

SASL

In SASL, the concat operator ++ is built-in <lang SASL>(1 2 3) ++ (4 5 6)</lang>

Scala

<lang Scala>val arr1 = Array( 1, 2, 3 ) val arr2 = Array( 4, 5, 6 ) val arr3 = Array( 7, 8, 9 )

arr1 ++ arr2 ++ arr3 //or: Array concat ( arr1, arr2, arr3 ) // res0: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)</lang>

Scheme

<lang scheme>; in r5rs, there is append for lists, but we'll need to define vector-append (define (vector-append . arg) (list->vector (apply append (map vector->list arg))))

(vector-append #(1 2 3 4) #(5 6 7) #(8 9 10))

#(1 2 3 4 5 6 7 8 9 10)</lang>

Note : vector-append is also defined in SRFI-43.

Concatening two-dimensional arrays

Works with: Gauche Scheme

<lang Scheme> (use gauche.array)

(define (print-matrix m)

 (define row-num #f)
 (array-for-each-index m
   (lambda (row col)
     (when (and row-num (not (= row-num row))) (newline))
     (format #t "~a " (array-ref m row col))
     (set! row-num row)))
 (newline))

(define a

 #,(<array> (0 3 0 2)
     a b
     c d
     e f))

(define b

 #,(<array> (0 3 0 2)
     1 2
     3 4
     5 6))

(print-matrix (array-concatenate a b)) (print-matrix (array-concatenate a b 1)) </lang>

Output:
a b
c d
e f
1 2
3 4
5 6

a b 1 2
c d 3 4
e f 5 6

Seed7

<lang seed7>$ include "seed7_05.s7i";

var array integer: a is [] (1, 2, 3, 4); var array integer: b is [] (5, 6, 7, 8); var array integer: c is [] (9, 10);

const proc: main is func

 local
   var integer: number is 0;
 begin
   c := a & b;
   for number range c do
     write(number <& " ");
   end for;
   writeln;
 end func;</lang>
Output:
1 2 3 4 5 6 7 8

SenseTalk

<lang sensetalk>put (1, 2, 3) into list1 put (4, 5, 6) into list2 put list1 &&& list2 into list3 put list3</lang>

SETL

<lang haskell>A := [1, 2, 3]; B := [3, 4, 5]; print(A + B); -- [1 2 3 3 4 5]</lang>

Sidef

<lang ruby>var arr1 = [1, 2, 3]; var arr2 = [4, 5, 6]; var arr3 = (arr1 + arr2); # => [1, 2, 3, 4, 5, 6]</lang>

Simula

<lang simula>BEGIN  ! Concatenate arrays - of REAL, here;

   CLASS REAL_ARRAY(N); INTEGER N;
   BEGIN
       REAL ARRAY DATA(1:N);
       ! Return a new REAL_ARRAY containing
       ! the values from this REAL_ARRAY 
       ! followed by the values from other;
       REF(REAL_ARRAY) PROCEDURE CONCAT(other);
           REF(REAL_ARRAY) other;
       BEGIN
           REF(REAL_ARRAY) C;
           INTEGER I;
    
           C :- NEW REAL_ARRAY(N + other.N);
    
           FOR I := 1 STEP 1 UNTIL N DO
               C.DATA(I) := DATA(I);
    
           FOR I := 1 STEP 1 UNTIL other.N DO
               C.DATA(N + I) := other.DATA(I);
    
           CONCAT :- C;
       END;
       ! Fill DATA;
       REF(REAL_ARRAY) PROCEDURE linearFill(start, stride);
           REAL start, stride;
       BEGIN
           linearFillFrom(DATA, 1, N, start, stride);
           linearFill :- this REAL_ARRAY
       END;
       
       PROCEDURE out(sink); REF(printfile) sink;
       BEGIN
           INTEGER i;
           FOR i := 1 STEP 1 UNTIL N DO
               sink.OUTFIX(DATA(i), 2, 7);
           sink.OUTIMAGE;
       END;
   END REAL_ARRAY;
   ! "The problem" is not array as an input parameter:
   !  I don't know how to
   ! "pass a new ARRAY out of a PROCEDURE";
   REF(REAL_ARRAY) PROCEDURE concatenate(a, b);
       REAL ARRAY a, b;
   BEGIN
       INTEGER i, a_, N, b_, M;
       REF(REAL_ARRAY) c;
       a_ := LOWERBOUND(a, 1) - 1;
       N := UPPERBOUND(a, 1) - a_;
       b_ := LOWERBOUND(a, 1) - 1;
       M := UPPERBOUND(b, 1) - b_;
       c :- NEW REAL_ARRAY(N + M);
       FOR i := 1 STEP 1 UNTIL N DO
           c.DATA(i) := a(a_+i);
       ! for readability, don't
       !  reduce one index expression to a variable
       FOR i := 1 STEP 1 UNTIL M DO
           c.DATA(N + i) := b(b_+i);
           
       concatenate :- c;
   END concatenate REAL ARRAYs;
   ! two more convenience PROCEDUREs;
   PROCEDURE linearFillFrom(a, from, inclusive, start, stride);
           REAL ARRAY a; ! passed by reference;
           INTEGER from, inclusive;
           REAL start, stride;
   BEGIN
       INTEGER i;
       FOR i := from STEP 1 UNTIL inclusive DO
           a(i) := start + stride * (i - from)
   END;
   PROCEDURE linearFill(a, start, stride);
           REAL ARRAY a;
           REAL start, stride;
       linearFillFrom(a, LOWERBOUND(a, 1), UPPERBOUND(a, 1),
                      start, stride);


   REF(REAL_ARRAY) X;
   REAL ARRAY u(1:3), v(1:4);
   linearFill(u, 3, 7);
   linearFill(v, 0, 5);
   concatenate(u, v).out(SYSOUT);
   X :- NEW REAL_ARRAY(3).linearFill(1, 2);
   X.out(SYSOUT);
   X.CONCAT(NEW REAL_ARRAY(4)
               .linearFill(-1, -3)).out(SYSOUT);

END.</lang>

Output:
   3.00  10.00  17.00   0.00   5.00  10.00  15.00
   1.00   3.00   5.00
   1.00   3.00   5.00  -1.00  -4.00  -7.00 -10.00

Slate

The binary operation of concatenation is made with the ; (semi-colon) from the type Sequence. It is also available for appending Sequences to WriteStreams.

<lang slate> {1. 2. 3. 4. 5} ; {6. 7. 8. 9. 10} </lang>

Smalltalk

Concatenation (appending) is made with the method , (comma), present in classes SequenceableCollection, ArrayedCollection and their subclasses (e.g. Array, String, OrderedCollection ...)

<lang smalltalk>|a b c| a := #(1 2 3 4 5). b := #(6 7 8 9 10). c := a,b. c displayNl.</lang>

SNOBOL4

Works with: Macro Spitbol
Works with: Snobol4+
Works with: CSnobol

<lang SNOBOL4>* # Concatenate 2 arrays (vectors)

       define('cat(a1,a2)i,j') :(cat_end)

cat cat = array(prototype(a1) + prototype(a2)) cat1 i = i + 1; cat = a1 :s(cat1) cat2 j = j + 1; cat = a2<j> :s(cat2)f(return) cat_end

  • # Fill arrays
       str1 = '1 2 3 4 5'; arr1 = array(5)

loop i = i + 1; str1 len(p) span('0123456789') . arr1 @p :s(loop)

       str2 = '6 7 8 9 10'; arr2 = array(5)

loop2 j = j + 1; str2 len(q) span('0123456789') . arr2<j> @q :s(loop2)

  • # Test and display
       arr3 = cat(arr1,arr2)

loop3 k = k + 1; str3 = str3 arr3<k> ' ' :s(loop3)

       output = str1
       output = str2
       output = str3

end</lang>

Output:
1 2 3 4 5
6 7 8 9 10
1 2 3 4 5 6 7 8 9 10

Standard ML

<lang Standard ML> val l1 = [1,2,3,4];; val l2 = [5,6,7,8];; val l3 = l1 @ l2 (* [1,2,3,4,5,6,7,8] *) </lang>

Stata

Macro language

<lang stata>. matrix a=2,9,4\7,5,3\6,1,8 . matrix list a

a[3,3]

   c1  c2  c3

r1 2 9 4 r2 7 5 3 r3 6 1 8

. matrix b=I(3) . matrix list b

symmetric b[3,3]

   c1  c2  c3

r1 1 r2 0 1 r3 0 0 1

. matrix c=a,b . matrix list c

c[3,6]

   c1  c2  c3  c1  c2  c3

r1 2 9 4 1 0 0 r2 7 5 3 0 1 0 r3 6 1 8 0 0 1

. matrix c=a\b . matrix list c

c[6,3]

   c1  c2  c3

r1 2 9 4 r2 7 5 3 r3 6 1 8 r1 1 0 0 r2 0 1 0 r3 0 0 1</lang>

Mata

<lang stata>. mata

a=2,9,4\7,5,3\6,1,8
b=I(3)
a,b
      1   2   3   4   5   6
   +-------------------------+
 1 |  2   9   4   1   0   0  |
 2 |  7   5   3   0   1   0  |
 3 |  6   1   8   0   0   1  |
   +-------------------------+
a\b
      1   2   3
   +-------------+
 1 |  2   9   4  |
 2 |  7   5   3  |
 3 |  6   1   8  |
 4 |  1   0   0  |
 5 |  0   1   0  |
 6 |  0   0   1  |
   +-------------+
end</lang>

Swift

<lang Swift>let array1 = [1,2,3] let array2 = [4,5,6] let array3 = array1 + array2</lang>

Tailspin

<lang tailspin> def a: [1, 2, 3]; def b: [4, 5, 6]; [$a..., $b...] -> !OUT::write </lang>

Output:
[1, 2, 3, 4, 5, 6]

Tcl

<lang tcl>set a {1 2 3} set b {4 5 6} set ab [concat $a $b]; # 1 2 3 4 5 6</lang> Note that in the Tcl language, “arrays” are hash maps of strings to variables, so the notion of concatenation doesn't really apply. What other languages (usually) call arrays are “lists” in Tcl.

TI-89 BASIC

If a and b are lists, augment(a, b) concatenates them in the usual fashion. If a and b are matrices, then augment(a, b) produces a matrix whose columns are the columns of a followed by the columns of b, i.e. an augmented matrix.

■ augment({1,2}, {3,4})
    {1,2,3,4}
■ augment([[1][2]], [[3][4]])
    [[1,3][2,4]]

That last example as displayed in pretty-printing mode:

 

 

Concatenation in the other direction may of course be done by transposition:

■ augment([[x][y]], [[z][w]])
    [[x][y][z][w]]

 

 

Trith

<lang trith>[1 2 3] [4 5 6] concat</lang>

UNIX Shell

Using proper built-in Bash arrays:

Works with: bash

<lang bash>array1=( 1 2 3 4 5 ) array2=( 6 7 8 9 10 ) botharrays=( ${array1[@]} ${array2[@]} )</lang>

Whitespace-delimited strings work in much the same way:

Works with: bash

<lang bash>array1='1 2 3 4 5' array2='6 7 8 9 10'

  1. Concatenated to a Bash array ...

botharrays_a=( $array1 $array2 )

  1. Concatenated to a string ...

botharrays_s="$array1 $array2"</lang>

Ursa

<lang ursa># create two streams (the ursa equivalent of arrays)

  1. a contains the numbers 1-10, b contains 11-20

decl int<> a b decl int i for (set i 1) (< i 11) (inc i)

       append i a

end for for (set i 11) (< i 21) (inc i)

       append i b

end for

  1. append the values in b to a

append b a

  1. output a to the console

out a endl console</lang>

Vala

<lang vala>int[] array_concat(int[]a,int[]b){ int[] c = new int[a.length + b.length]; Memory.copy(c, a, a.length * sizeof(int)); Memory.copy(&c[a.length], b, b.length * sizeof(int)); return c; } void main(){ int[] a = {1,2,3,4,5}; int[] b = {6,7,8}; int[] c = array_concat(a,b); foreach(int i in c){ stdout.printf("%d\n",i); } }</lang>

VBA

<lang vb> Option Explicit

Sub MainConcat_Array() Dim Aray_1() As Variant, Aray_2() As Variant Dim Result() As Variant

   Aray_1 = Array(1, 2, 3, 4, 5, #11/24/2017#, "azerty")
   Aray_2 = Array("A", "B", "C", 18, "End")
   Result = Concat_Array(Aray_1, Aray_2)
   Debug.Print "With Array 1 : " & Join(Aray_1, ", ")
   Debug.Print "And Array 2 : " & Join(Aray_2, ", ")
   Debug.Print "The result is Array 3 : " & Join(Result, ", ")

End Sub

Function Concat_Array(A1() As Variant, A2() As Variant) As Variant() Dim TmpA1() As Variant, N As Long, i As Long

   N = UBound(A1) + 1
   TmpA1 = A1
   ReDim Preserve TmpA1(N + UBound(A2))
   For i = N To UBound(TmpA1)
       TmpA1(i) = A2(i - N)
   Next
   Concat_Array = TmpA1

End Function </lang>

Output:
With Array 1 : 1, 2, 3, 4, 5, 24/11/2017, azerty
And Array 2 : A, B, C, 18, End
The result is Array 3 : 1, 2, 3, 4, 5, 24/11/2017, azerty, A, B, C, 18, End

VBScript

<lang vb>Function ArrayConcat(arr1, arr2)

   ReDim ret(UBound(arr1) + UBound(arr2) + 1)
   For i = 0 To UBound(arr1)
       ret(i) = arr1(i)
   Next
   offset = Ubound(arr1) + 1
   For i = 0 To UBound(arr2)
       ret(i + offset) = arr2(i)
   Next
   ArrayConcat = ret

End Function

arr1 = array(10,20,30) arr2 = array(40,50,60) WScript.Echo "arr1 = array(" & Join(arr1,", ") & ")" WScript.Echo "arr2 = array(" & Join(arr2,", ") & ")" arr3 = ArrayConcat(arr1, arr2) WScript.Echo "arr1 + arr2 = array(" & Join(arr3,", ") & ")"</lang>

Output:
arr1 = array(10, 20, 30)
arr2 = array(40, 50, 60)
arr1 + arr2 = array(10, 20, 30, 40, 50, 60)

Visual Basic .NET

<lang vbnet>

   Dim iArray1() As Integer = {1, 2, 3}
   Dim iArray2() As Integer = {4, 5, 6}
   Dim iArray3() As Integer = Nothing
   iArray3 = iArray1.Concat(iArray2).ToArray

</lang>

Vlang

V uses a << operator for array concatenation. Destination array needs to be mutable.

<lang go>// V, array concatenation // Tectonics: v run array-concatenation.v module main

// starts here pub fn main() {

   mut arr1 := [1,2,3,4]
   arr2 := [5,6,7,8]
   arr1 << arr2
   println(arr1)

}</lang>

Output:
$ v run array-concatenation.v
[1, 2, 3, 4, 5, 6, 7, 8]

Wart

Wart doesn't have arrays yet, just lists.

<lang wart>a <- '(1 2 3) b <- '(4 5 6) a+b

  1. => (1 2 3 4 5 6)</lang>

Wren

<lang ecmascript>var arr1 = [1,2,3] var arr2 = [4,5,6] System.print(arr1 + arr2)</lang>

Output:
[1, 2, 3, 4, 5, 6]

Yabasic

<lang Yabasic>sub arrayConcatenation(a(), b()) local ta, tb, nt, i

ta = arraysize(a(), 1) tb = arraysize(b(), 1)

nt = ta + tb

redim a(nt)

for i = ta + 1 to nt a(i) = b(i - ta) next i

return nt end sub

//===============================

SIZE = 5

dim a(SIZE) dim b(SIZE)

for i = 1 to SIZE a(i) = i b(i) = i + SIZE next i

nt = arrayConcatenation(a(), b())

for i = 1 to nt print a(i); if i < nt print ", "; next i print</lang>

Yacas

<lang Yacas>Concat({1,2,3}, {4,5,6})

Out> {1, 2, 3, 4, 5, 6}</lang>

Yorick

<lang yorick>a = [1,2,3]; b = [4,5,6]; ab = grow(a, b);</lang>

Z80 Assembly

The routine Monitor_Memdump displays a hexdump to the Amstrad CPC's screen. Credit to Keith of ChibiAkumas for creating it.

<lang z80> org $8000

ld hl,TestArray1 ; pointer to first array ld de,ArrayRam ; pointer to ram area ld bc,6  ; size of first array ldir

; DE is already adjusted past the last entry ; of the first array

ld hl,TestArray2 ; pointer to second array ld bc,4 ; size of second array ldir

call Monitor_MemDump db 32 ; hexdump 32 bytes (only the bytes from the arrays will be shown in the output for clarity) dw ArrayRam ; start dumping from ArrayRam

ret ; return to basic

ArrayRam: ds 24,0 ;24 bytes of ram initialized to zero

org $9000 TestArray2: byte $23,$45,$67,$89 ; just to prove that this doesn't rely on the arrays ; being "already concatenated" I've stored them ; in the reverse order. TestArray1: byte $aa,$bb,$cc,$dd,$ee,$ff</lang>

Output:
801D:
AA BB CC DD EE FF 23 45 67 89

zkl

Lists (both mutable and read only), no built in support for numeric vectors/arrays/matrices <lang zkl>T(1,2).extend(T(4,5,6)) //-->L(1,2,4,5,6) T(1,2).extend(4,5,6) //-->L(1,2,4,5,6)</lang>

zonnon

<lang> module Main; import System.Collections.ArrayList as Array, System.Console as Console;

type Vector = array {math} * of integer;

procedure Concat(x,y: Vector): Vector; var i,k: integer; res: Vector; begin res := new Vector(len(x) + len(y)); k := 0; for i := 0 to len(x) - 1 do res[k] := x[i];inc(k) end; for i := 0 to len(y) - 1 do res[k] := y[i];inc(k) end; return res end Concat;

procedure Concat2(x,y: Array): Array; var i: integer; res: Array; begin res := new Array(x.Count + y.Count); for i := 0 to x.Count - 1 do res.Add(x[i]); end; for i := 0 to y.Count - 1 do res.Add(y[i]); end; return res end Concat2;

procedure WriteVec(x: Vector); var i: integer; begin for i := 0 to len(x) - 1 do; write(x[i]:3) end; writeln; end WriteVec;

procedure WriteAry(x: Array); var i: integer; begin for i := 0 to x.Count - 1 do; Console.Write("{0,3}",x[i]) end; writeln; end WriteAry;

var a,b: Vector; x,y: Array; begin a := [1,2,3,4]; b := [6,7,8,9]; WriteVec(Concat(a,b));

x := new Array(4); y := new Array(4); x.Add(2);x.Add(4);x.Add(6);x.Add(8); y.Add(3);y.Add(5);y.Add(9);y.Add(11);

WriteAry(Concat2(x,y)); end Main. </lang>

Output:
  1  2  3  4  6  7  8  9
  2  4  6  8  3  5  9 11

Zsh

Concatenating arrays. <lang zsh>a=(1 2 3) b=(a b c)

c=($a $b)</lang> Pushing a single element into an array. <lang zsh>a+=4</lang> Pushing another array into an array. <lang zsh>a+=($b)</lang>

ZX Spectrum Basic

Translation of: Liberty BASIC

<lang zxbasic>10 LET x=10 20 LET y=20 30 DIM a(x) 40 DIM b(y) 50 DIM c(x+y) 60 FOR i=1 TO x 70 LET c(i)=a(i) 80 NEXT i 90 FOR i=1 TO y 100 LET c(x+i)=b(i) 110 NEXT i 120 FOR i=1 TO x+y 130 PRINT c(i);", "; 140 NEXT i </lang>