Filter: Difference between revisions

50,520 bytes added ,  1 month ago
 
(91 intermediate revisions by 46 users not shown)
Line 3:
 
;Task:
Select certain elements from an Array into a new Array in a generic way.
 
 
To demonstrate, select all even numbers from an Array.
 
As an option, give a second solution which filters destructively,
by modifying the original Array rather than creating a new Array.
<br><br>
Line 14:
=={{header|11l}}==
 
<langsyntaxhighlight lang="11l">V array = Array(1..10)
V even = array.filter(n -> n % 2 == 0)
print(even)</langsyntaxhighlight>
 
{{out}}
<pre>
[2, 4, 6, 8, 10]
</pre>
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits <br> or android 64 bits with application Termux }}
<syntaxhighlight lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program filterdes64.s */
 
/************************************/
/* Constantes */
/************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
/************************************/
/* Initialized data */
/************************************/
.data
szMessResult: .asciz "Start array : "
szMessResultFil: .asciz "Filter array : "
szMessResultdest: .asciz "Same array : "
szMessStart: .asciz "Program 64 bits start.\n"
szCarriageReturn: .asciz "\n"
szFiller: .asciz " "
.align 4
arrayNumber: .quad 1,2,3,4,5,6,7,8,9,10
.equ LGARRAY, (. - arrayNumber) / 8
/************************************/
/* UnInitialized data */
/************************************/
.bss
.align 4
arrayNumberFil: .skip 8 * LGARRAY // result array
sZoneConv: .skip 24
/************************************/
/* code section */
/************************************/
.text
.global main
main:
ldr x0,qAdrszMessStart // display start message
bl affichageMess
ldr x0,qAdrszMessResult // display message
bl affichageMess
ldr x5,qAdrarrayNumber // start array address
mov x4,#0 // index
1:
ldr x0,[x5,x4,lsl #3] // load a value
ldr x1,qAdrsZoneConv
bl conversion10 // décimal conversion
ldr x0,qAdrsZoneConv
bl affichageMess // display value
ldr x0,qAdrszFiller
bl affichageMess
add x4,x4,#1 // increment index
cmp x4,#LGARRAY // end array ?
blt 1b // no -> loop
ldr x0,qAdrszCarriageReturn
bl affichageMess
ldr x6,qAdrarrayNumberFil // adrress result array
mov x4,#0 // index
mov x3,#0 // index result
2:
ldr x0,[x5,x4,lsl #3] // load a value
tst x0,#1 // odd ?
bne 3f
str x0,[x6,x3,lsl #3] // no -> store in result array
add x3,x3,#1 // and increment result index
3:
add x4,x4,#1 // increment array index
cmp x4,#LGARRAY // end ?
blt 2b // no -> loop
ldr x0,qAdrszMessResultFil
bl affichageMess
mov x4,#0 // init index
4: // display filter result array
ldr x0,[x6,x4,lsl #3]
ldr x1,qAdrsZoneConv
bl conversion10
ldr x0,qAdrsZoneConv
bl affichageMess
ldr x0,qAdrszFiller
bl affichageMess
add x4,x4,#1
cmp x4,x3
blt 4b
ldr x0,qAdrszCarriageReturn
bl affichageMess
// array destruction
mov x4,#0 // index
mov x3,#0 // index result
5:
ldr x0,[x5,x4,lsl #3] // load a value
tst x0,#1 // odd ?
bne 7f
cmp x3,x4 // index = no store
beq 6f
str x0,[x5,x3,lsl #3] // store in free item on same array
6:
add x3,x3,#1 // and increment result index
7:
add x4,x4,#1 // increment array index
cmp x4,#LGARRAY // end ?
blt 5b // no -> loop
ldr x0,qAdrszMessResultdest
bl affichageMess
mov x4,#0 // init index
8: // display array
ldr x0,[x5,x4,lsl #3]
ldr x1,qAdrsZoneConv
bl conversion10
ldr x0,qAdrsZoneConv
bl affichageMess
ldr x0,qAdrszFiller
bl affichageMess
add x4,x4,#1
cmp x4,x3
blt 8b
ldr x0,qAdrszCarriageReturn
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
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrszMessStart: .quad szMessStart
qAdrarrayNumber: .quad arrayNumber
qAdrszMessResult: .quad szMessResult
qAdrarrayNumberFil: .quad arrayNumberFil
qAdrszMessResultFil: .quad szMessResultFil
qAdrszMessResultdest: .quad szMessResultdest
qAdrsZoneConv: .quad sZoneConv
qAdrszFiller: .quad szFiller
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeARM64.inc"
 
 
</syntaxhighlight>
{{Out}}
<pre>
Program 64 bits start.
Start array : 1 2 3 4 5 6 7 8 9 10
Filter array : 2 4 6 8 10
Same array : 2 4 6 8 10
</pre>
 
=={{header|ACL2}}==
<langsyntaxhighlight Lisplang="lisp">(defun filter-evens (xs)
(cond ((endp xs) nil)
((evenp (first xs))
(cons (first xs) (filter-evens (rest xs))))
(t (filter-evens (rest xs)))))</langsyntaxhighlight>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">DEFINE PTR="CARD"
 
INT value ;used in predicate
 
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(']) PutE()
RETURN
 
;jump addr is stored in X and A registers
BYTE FUNC Predicate=*(PTR jumpAddr)
DEFINE STX="$8E"
DEFINE STA="$8D"
DEFINE JSR="$20"
DEFINE RTS="$60"
[STX Predicate+8
STA Predicate+7
JSR $00 $00
RTS]
 
PROC DoFilter(PTR predicateFun
INT ARRAY src BYTE srcSize
INT ARRAY dst BYTE POINTER dstSize)
 
INT i
 
dstSize^=0
FOR i=0 TO srcSize-1
DO
value=src(i)
IF Predicate(predicateFun) THEN
dst(dstSize^)=value
dstSize^==+1
FI
OD
RETURN
 
PROC DoFilterInplace(PTR predicateFun
INT ARRAY data BYTE POINTER size)
 
INT i,j
 
i=0
WHILE i<size^
DO
value=data(i)
IF Predicate(predicateFun)=0 THEN
FOR j=i TO size^-2
DO
data(j)=data(j+1)
OD
size^==-1
ELSE
i==+1
FI
OD
RETURN
 
BYTE FUNC Even()
IF (value&1)=0 THEN
RETURN (1)
FI
RETURN (0)
 
BYTE FUNC NonNegative()
IF value>=0 THEN
RETURN (1)
FI
RETURN (0)
 
PROC Main()
INT ARRAY src=[65532 3 5 2 65529 1 0 65300 4123],dst(9)
BYTE srcSize=[9],dstSize
 
PrintE("Non destructive operations:") PutE()
PrintE("Original array:")
PrintArray(src,srcSize)
 
DoFilter(Even,src,srcSize,dst,@dstSize)
PrintE("Select all even numbers:")
PrintArray(dst,dstSize)
 
DoFilter(NonNegative,src,srcSize,dst,@dstSize)
PrintE("Select all non negative numbers:")
PrintArray(dst,dstSize)
 
PutE()
PrintE("Destructive operations:") PutE()
PrintE("Original array:")
PrintArray(src,srcSize)
 
DoFilterInplace(Even,src,@srcSize)
PrintE("Select all even numbers:")
PrintArray(src,srcSize)
 
DoFilterInplace(NonNegative,src,@srcSize)
PrintE("Select all non negative numbers:")
PrintArray(src,srcSize)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Filter.png Screenshot from Atari 8-bit computer]
<pre>
Non destructive operations:
 
Original array:
[-4 3 5 2 -7 1 0 -236 4123]
Select all even numbers:
[-4 2 0 -236]
Select all non negative numbers:
[3 5 2 1 0 4123]
 
Destructive operations:
 
Original array:
[-4 3 5 2 -7 1 0 -236 4123]
Select all even numbers:
[-4 2 0 -236]
Select all non negative numbers:
[2 0]
</pre>
 
=={{header|ActionScript}}==
<langsyntaxhighlight lang="actionscript">var arr:Array = new Array(1, 2, 3, 4, 5);
var evens:Array = new Array();
for (var i:int = 0; i < arr.length(); i++) {
if (arr[i] % 2 == 0)
evens.push(arr[i]);
}</langsyntaxhighlight>
 
'''Actionscript 3'''
<langsyntaxhighlight lang="actionscript">var arr:Array = new Array(1, 2, 3, 4, 5);
arr = arr.filter(function(item:int, index:int, array:Array) {
return item % 2 == 0;
});
</syntaxhighlight>
</lang>
 
=={{header|Ada}}==
<langsyntaxhighlight lang="ada">with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;
with Ada.Text_Io; use Ada.Text_Io;
 
procedure Array_Selection is
type Array_Type is array (Positive range <>) of Integer;
Null_Array : Array_Type(1..0);
 
function Evens (Item : Array_Type) return Array_Type is
begin
Line 65 ⟶ 351:
end if;
end Evens;
 
procedure Print(Item : Array_Type) is
begin
Line 73 ⟶ 359:
end loop;
end Print;
 
Foo : Array_Type := (1,2,3,4,5,6,7,8,9,10);
begin
Print(Evens(Foo));
end Array_Selection;</langsyntaxhighlight>
Here is a non-recursive solution:
<langsyntaxhighlight lang="ada">with Ada.Text_IO; use Ada.Text_IO;
 
procedure Array_Selection is
type Array_Type is array (Positive range <>) of Integer;
 
function Evens (Item : Array_Type) return Array_Type is
Result : Array_Type (1..Item'Length);
Line 96 ⟶ 382:
return Result (1..Index - 1);
end Evens;
 
procedure Put (Item : Array_Type) is
begin
Line 106 ⟶ 392:
Put (Evens ((1,2,3,4,5,6,7,8,9,10)));
New_Line;
end Array_Selection;</langsyntaxhighlight>
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">integer
even(integer e)
{
Line 159 ⟶ 445:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre> 0 2 4 6 8</pre>
Line 167 ⟶ 453:
{{works with|ALGOL 68G|Any - tested with release mk15-0.8b.fc9.i386}}
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386}}
<langsyntaxhighlight lang="algol68">MODE TYPE = INT;
 
PROC select = ([]TYPE from, PROC(TYPE)BOOL where)[]TYPE:
BEGIN
FLEX[0]TYPE result;
Line 189 ⟶ 475:
 
# Or as a simple one line query #
print((select((1,4,9,16,25,36,49,64,81,100), (TYPE x)BOOL: NOT ODD x ), new line))</langsyntaxhighlight>
{{out}}
<pre>
+2 +4 +6 +8 +10
+4 +16 +36 +64 +100
</pre>
 
=={{header|ALGOL W}}==
In the original Algol W, for procedures passed as parameters to another procedure, the types of the expected parameters could not be specified. (The types of the reuired parameters had to match exactly with those in the call)<br>
In the sample below, the ''select'' procedure's parameters do not include the parameters of ''where'' - they are commented out.<br>
Recent compilers (such as Awe) require the parameter types be specified and so the parameters to ''where'' should be uncommented when compilling with Awe.
<syntaxhighlight lang="algolw">begin
% sets the elements of out to the elements of in that return true from applying the where procedure to them %
% the bounds of in must be 1 :: inUb - out must be at least as big as in and the number of matching %
% elements is returned in outUb - in and out can be the same array %
procedure select ( integer array in ( * ); integer value inUb
; integer array out ( * ); integer result outUb
; logical procedure where % ( integer value n ) %
) ;
begin
outUb := 0;
for i := 1 until inUb do begin
if where( in( i ) ) then begin
outUb := outUb + 1;
out( outUb ) := in( i )
end f_where_in_i
end for_i
end select ;
% test the select procedure %
logical procedure isEven ( integer value n ) ; not odd( n );
integer array t, out ( 1 :: 10 );
integer outUb;
for i := 1 until 10 do t( i ) := i;
select( t, 10, out, outUb, isEven );
for i := 1 until outUb do writeon( i_w := 3, s_w := 0, out( i ) );
write()
end.
</syntaxhighlight>
{{out}}
<pre>
2 4 6 8 10
</pre>
 
=={{header|AmigaE}}==
<langsyntaxhighlight lang="amigae">PROC main()
DEF l : PTR TO LONG, r : PTR TO LONG, x
l := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Line 203 ⟶ 525:
SelectList({x}, l, r, `Mod(x,2)=0)
ForAll({x}, r, `WriteF('\d\n', x))
ENDPROC</langsyntaxhighlight>
 
=={{header|AntLang}}==
<langsyntaxhighlight AntLanglang="antlang">x:range[100]
{1- x mod 2}hfilter x</langsyntaxhighlight>
 
=={{header|Apex}}==
<langsyntaxhighlight Apexlang="apex">List<Integer> integers = new List<Integer>{1,2,3,4,5};
Set<Integer> evenIntegers = new Set<Integer>();
for(Integer i : integers)
Line 224 ⟶ 546:
system.assert(!evenIntegers.contains(3), '3 should not be a number in the set');
system.assert(evenIntegers.contains(4), '4 should be a number in the set');
system.assert(!evenIntegers.contains(5), '5 should not be a number in the set');</langsyntaxhighlight>
 
=={{header|APL}}==
<langsyntaxhighlight APLlang="apl"> (0=2|x)/x←⍳20
2 4 6 8 10 12 14 16 18 20</langsyntaxhighlight>
 
=={{header|AppleScript}}==
<langsyntaxhighlight lang="applescript">set array to {1, 2, 3, 4, 5, 6}
set evens to {}
repeat with i in array
if (i mod 2 = 0) then set end of evens to i's contents
end repeat
return evens</langsyntaxhighlight>Result is (a list):<pre>{2, 4, 6}</pre>
 
Here's how you might implement a more generic filter, passing a script object to represent the test that elements must pass (obviously overkill for this simple example):
 
<langsyntaxhighlight AppleScriptlang="applescript">to filter(inList, acceptor)
set outList to {}
repeat with anItem in inList
Line 256 ⟶ 578:
end script
 
filter({1,2,3,4,5,6}, isEven)</langsyntaxhighlight>
 
 
Line 268 ⟶ 590:
This allows for context-sensitive filters, which can take account of following or preceding elements in a sequence.
 
<syntaxhighlight lang="applescript">-------------------------- FILTER --------------------------
<lang AppleScript>-- filter :: (a -> Bool) -> [a] -> [a]
 
-- filter :: (a -> Bool) -> [a] -> [a]
on filter(f, xs)
tell mReturn(f)
Line 281 ⟶ 605:
end filter
 
-- TEST -----------------------------------------------------------------------
 
-- isEven :: (a -> Bool)
on isEven(x)
x mod 2 = 0
end isEven
 
--------------------------- TEST ---------------------------
on run
filter(even, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
 
filter(isEven, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
--> {0, 2, 4, 6, 8, 10}
-- {0, 2, 4, 6, 8, 10}
end run
 
-- GENERIC FUNCTION -----------------------------------------------------------
 
-------------------- GENERIC FUNCTIONS ---------------------
-- Lift 2nd class handler function into 1st class script wrapper
 
-- even :: Int -> Bool
on even(x)
0 = x mod 2
end even
 
 
-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: Handler -> Script
on mReturn(f)
Line 307 ⟶ 632:
end script
end if
end mReturn</langsyntaxhighlight>
{{Out}}
<pre>{0, 2, 4, 6, 8, 10}</pre>
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi <br> or android 32 bits with application Termux}}
<syntaxhighlight lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program filterdes.s */
 
/************************************/
/* Constantes */
/************************************/
/* for constantes see task include a file in arm assembly */
.include "../constantes.inc"
 
/************************************/
/* Initialized data */
/************************************/
.data
szMessResult: .asciz "Start array : "
szMessResultFil: .asciz "Filter array : "
szMessResultdest: .asciz "Same array : "
szMessStart: .asciz "Program 32 bits start.\n"
szCarriageReturn: .asciz "\n"
.align 4
arrayNumber: .int 1,2,3,4,5,6,7,8,9,10
.equ LGARRAY, (. - arrayNumber) / 4
/************************************/
/* UnInitialized data */
/************************************/
.bss
.align 4
arrayNumberFil: .skip 4 * LGARRAY @ result array
sZoneConv: .skip 24
/************************************/
/* code section */
/************************************/
.text
.global main
main:
ldr r0,iAdrszMessStart @ display start message
bl affichageMess
ldr r0,iAdrszMessResult @ display message
bl affichageMess
ldr r5,iAdrarrayNumber @ start array address
mov r4,#0 @ index
1:
ldr r0,[r5,r4,lsl #2] @ load a value
ldr r1,iAdrsZoneConv
bl conversion10 @ décimal conversion
add r1,r1,r0 @ compute address end number
add r1,#2 @ add two characters
mov r0,#0 @ for limit the size of display number
strb r0,[r1] @ to store a final zero
ldr r0,iAdrsZoneConv
bl affichageMess @ display value
add r4,r4,#1 @ increment index
cmp r4,#LGARRAY @ end array ?
blt 1b @ no -> loop
ldr r0,iAdrszCarriageReturn
bl affichageMess
ldr r6,iAdrarrayNumberFil @ adrress result array
mov r4,#0 @ index
mov r3,#0 @ index result
2:
ldr r0,[r5,r4,lsl #2] @ load a value
tst r0,#1 @ odd ?
streq r0,[r6,r3,lsl #2] @ no -> store in result array
addeq r3,r3,#1 @ and increment result index
add r4,r4,#1 @ increment array index
cmp r4,#LGARRAY @ end ?
blt 2b @ no -> loop
ldr r0,iAdrszMessResultFil
bl affichageMess
mov r4,#0 @ init index
3: @ display filter result array
ldr r0,[r6,r4,lsl #2]
ldr r1,iAdrsZoneConv
bl conversion10
add r1,r1,r0
add r1,#2
mov r0,#0
strb r0,[r1]
ldr r0,iAdrsZoneConv
bl affichageMess
add r4,r4,#1
cmp r4,r3
blt 3b
ldr r0,iAdrszCarriageReturn
bl affichageMess
@ array destruction
mov r4,#0 @ index
mov r3,#0 @ index result
4:
ldr r0,[r5,r4,lsl #2] @ load a value
tst r0,#1 @ even ?
bne 6f
cmp r3,r4 @ index = no store
beq 5f
str r0,[r5,r3,lsl #2] @ store in free item on same array
5:
add r3,r3,#1 @ and increment result index
6:
add r4,r4,#1 @ increment array index
cmp r4,#LGARRAY @ end ?
blt 4b @ no -> loop
ldr r0,iAdrszMessResultdest
bl affichageMess
mov r4,#0 @ init index
7: @ display array
ldr r0,[r5,r4,lsl #2]
ldr r1,iAdrsZoneConv
bl conversion10
add r1,r1,r0
add r1,#2
mov r0,#0
strb r0,[r1]
ldr r0,iAdrsZoneConv
bl affichageMess
add r4,r4,#1
cmp r4,r3
blt 7b
ldr r0,iAdrszCarriageReturn
bl affichageMess
 
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc 0 @ perform the system call
iAdrszCarriageReturn: .int szCarriageReturn
iAdrszMessStart: .int szMessStart
iAdrarrayNumber: .int arrayNumber
iAdrszMessResult: .int szMessResult
iAdrarrayNumberFil: .int arrayNumberFil
iAdrszMessResultFil: .int szMessResultFil
iAdrszMessResultdest: .int szMessResultdest
iAdrsZoneConv: .int sZoneConv
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
/* for this file see task include a file in language ARM assembly*/
.include "../affichage.inc"
 
</syntaxhighlight>
{{Out}}
<pre>
Program 32 bits start.
Start array : 1 2 3 4 5 6 7 8 9 10
Filter array : 2 4 6 8 10
Same array : 2 4 6 8 10
</pre>
 
=={{header|Arturo}}==
<langsyntaxhighlight arturolang="rebol">arr: #([1 2 3 4 5 6 7 8 9 10)]
 
print [filterselect arr =>[x][even? isEvenx]</langsyntaxhighlight>
 
{{out}}
 
<pre>#(2 4 6 8 10)</pre>
<pre>2 4 6 8 10</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight lang="autohotkey">array = 1,2,3,4,5,6,7
loop, parse, array, `,
{
Line 340 ⟶ 822:
 
even(s) {
loop, parse, s, `,
if !mod(A_LoopField, 2)
r .= "," A_LoopField
return SubStr(r, 2)
Line 355 ⟶ 837:
r := []
For k, v in a
if !mod(v, 2)
r.Insert(v)
return r
Line 363 ⟶ 845:
s_join(o, a) {
Loop, % a.MaxIndex()
r .= o a[A_Index]
return SubStr(r, StrLen(o) + 1)
}
Line 371 ⟶ 853:
 
 
</syntaxhighlight>
</lang>
 
=={{header|AWK}}==
In this example, an array is filled with the numbers 1..9.
In a loop, even elements are collected into the string ''r''.
Note that sequence is not necessarily maintained.
 
'''One-liner:'''
<langsyntaxhighlight lang="awk">$ awk 'BEGIN{split("1 2 3 4 5 6 7 8 9",a);for(i in a)if(!(a[i]%2))r=r" "a[i];print r}'</langsyntaxhighlight>
{{out}}
<pre>4 6 8 2</pre>
 
'''Regular script:'''
<langsyntaxhighlight lang="awk">
BEGIN {
split("1 2 3 4 5 6 7 8 9",a);
for(i in a) if( !(a[i]%2) ) r = r" "a[i];
print r
}
</syntaxhighlight>
</lang>
Same output.
 
=={{header|Batch File}}==
<langsyntaxhighlight lang="dos">
@echo off
setlocal enabledelayedexpansion
Line 453 ⟶ 935:
set /a length+=1
goto lengthloop
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 463 ⟶ 945:
numberarray - 2 4 6 8 10
</pre>
 
 
=={{header|BBC BASIC}}==
<langsyntaxhighlight lang="bbcbasic"> REM Create the test array:
items% = 1000
DIM array%(items%)
Line 472 ⟶ 953:
array%(index%) = RND
NEXT
 
REM Count the number of filtered items:
filtered% = 0
Line 478 ⟶ 959:
IF FNfilter(array%(index%)) filtered% += 1
NEXT
 
REM Create a new array containing the filtered items:
DIM new%(filtered%)
Line 488 ⟶ 969:
ENDIF
NEXT
 
REM Alternatively modify the original array:
filtered% = 0
Line 498 ⟶ 979:
NEXT
END
 
DEF FNfilter(A%) = ((A% AND 1) = 0)</langsyntaxhighlight>
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
// Copy every value for which p(x) is true from in to out
// This will also work in place by setting out = in
let filter(p, in, ilen, out, olen) be
$( !olen := 0
for i = 0 to ilen-1 do
if p(in!i) do
$( out!!olen := in!i
!olen := !olen + 1
$)
$)
 
// Write N elements from vector
let writevec(v, n) be
for i = 0 to n-1 do writef("%N ", v!i)
 
let start() be
$( // Predicates
let even(n) = (n&1) = 0
let mul3(n) = n rem 3 = 0
let nums = table 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
let arr = vec 20
let len = ?
writes("Numbers: ")
writevec(nums, 15)
// Filter 'nums' into 'arr'
filter(even, nums, 15, arr, @len)
writes("*NEven numbers: ")
writevec(arr, len)
// Filter 'arr' in place for multiples of 3
filter(mul3, arr, len, arr, @len)
writes("*NEven multiples of 3: ")
writevec(arr, len)
wrch('*N')
$)</syntaxhighlight>
{{out}}
<pre>Numbers: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Even numbers: 2 4 6 8 10 12 14
Even multiples of 3: 6 12</pre>
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( :?odds
& ( 1 2 3 4 5 6 7 8 9 10 16 25 36 49 64 81 100:? (=.!sjt*1/2:/&!odds !sjt:?odds)$() ()
| !odds
)
)
</syntaxhighlight>
</lang>
<pre>1 3 5 7 9 25 49 81</pre>
 
=={{header|Brat}}==
<langsyntaxhighlight lang="brat">#Prints [2, 4, 6, 8, 10]
p 1.to(10).select { x | x % 2 == 0 }</langsyntaxhighlight>
 
=={{header|Burlesque}}==
 
<langsyntaxhighlight lang="burlesque">
blsq ) 1 13r@{2.%n!}f[
{2 4 6 8 10 12}
</syntaxhighlight>
</lang>
 
=={{header|BQN}}==
 
General filtering is done using the <code>/</code>(Replicate) function, which can fliter elements given a bitmask. We can make a modifier based on it to accept a function for filtering.
 
<syntaxhighlight lang="bqn">_filter ← {(𝔽𝕩)/𝕩}
Odd ← 2⊸|
 
Odd _filter 1‿2‿3‿4‿5</syntaxhighlight>
<syntaxhighlight lang="text">⟨ 1 3 5 ⟩</syntaxhighlight>
 
=={{header|C}}==
<langsyntaxhighlight Clang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 566 ⟶ 1,101:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>Filtered even: 2 4 6 8 10
Line 573 ⟶ 1,108:
=={{header|C sharp|C#}}==
{{works with|.NET|1.1}}
<langsyntaxhighlight lang="csharp">ArrayList array = new ArrayList( new int[] { 1, 2, 3, 4, 5 } );
ArrayList evens = new ArrayList();
foreach( int i in array )
Line 581 ⟶ 1,116:
}
foreach( int i in evens )
System.Console.WriteLine( i.ToString() );</langsyntaxhighlight>
{{works with|.NET|2.0}}
<langsyntaxhighlight lang="csharp">List<int> array = new List<int>( new int[] { 1, 2, 3, 4, 5 } );
List<int> evens = array.FindAll( delegate( int i ) { return (i%2)==0; } );
foreach( int i in evens )
System.Console.WriteLine( i.ToString() );</langsyntaxhighlight>
{{works with|.NET|3.5}}
<langsyntaxhighlight lang="csharp">IEnumerable<int> array = new List<int>( new int[] { 1, 2, 3, 4, 5 } );
IEnumerable<int> evens = array.Where( delegate( int i ) { return (i%2)==0; } );
foreach( int i in evens )
System.Console.WriteLine( i.ToString() );</langsyntaxhighlight>
Replacing the delegate with the more concise lambda expression syntax.
<langsyntaxhighlight lang="csharp">int[] array = { 1, 2, 3, 4, 5 };
int[] evens = array.Where(i => (i % 2) == 0).ToArray();
 
foreach (int i in evens)
Console.WriteLine(i);</langsyntaxhighlight>
 
=={{header|C++}}==
 
<langsyntaxhighlight lang="cpp">#include <vector>
#include <algorithm>
#include <functional>
Line 618 ⟶ 1,153:
 
return 0;
}</langsyntaxhighlight>
 
 
{{works with|C++11}}
<langsyntaxhighlight lang="cpp">#include <vector>
#include <algorithm>
#include <iterator>
Line 638 ⟶ 1,173:
// print result
copy(evens.begin(), evens.end(), ostream_iterator<int>(cout, "\n"));
}</langsyntaxhighlight>
 
=={{header|Clean}}==
The standard environment is required for list and array comprehensions. We specify the types of the functions because array comprehensions are overloaded. Clean provides lazy, strict, and unboxed arrays.
 
<langsyntaxhighlight lang="clean">module SelectFromArray
 
import StdEnv</langsyntaxhighlight>
 
Create a lazy array where each element comes from the list 1 to 10.
 
<langsyntaxhighlight lang="clean">array :: {Int}
array = {x \\ x <- [1 .. 10]}</langsyntaxhighlight>
 
Create (and print) a strict array where each element (coming from another array) is even.
 
<langsyntaxhighlight lang="clean">Start :: {!Int}
Start = {x \\ x <-: array | isEven x}</langsyntaxhighlight>
 
=={{header|Clojure}}==
 
<langsyntaxhighlight lang="lisp">;; range and filter create lazy seq's
(filter even? (range 0 100))
;; vec will convert any type of seq to an array
(vec (filter even? (vec (range 0 100))))</langsyntaxhighlight>
 
=={{header|CoffeeScript}}==
<langsyntaxhighlight lang="coffee">[1..10].filter (x) -> not (x%2)</langsyntaxhighlight>
 
{{out}}
Line 675 ⟶ 1,210:
 
=={{header|Common Lisp}}==
Common Lisp has many ways of accomplishing this task. Most of them involve higher-order sequence functions that take a predicate as the first argument and a list as the second argument. A predicate is a function that returns a boolean. The higher-order functions call the predicate for each element in list, testing the element.
 
In this example, the goal is to find the even numbers. The most straight-forward function is to use remove-if-not, which removes elements from the list that does ''not'' pass the predicate. The predicate, in this case, tests to see if an element is even. Therefore, the remove-if-not acts like a filter:
 
<langsyntaxhighlight lang="lisp">(remove-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10))
> (2 4 6 8 10)</langsyntaxhighlight>
 
However, this function is non-destructive, meaning the function creates a brand new list. This might be too prohibitive for very large lists.
Line 687 ⟶ 1,222:
There is a destructive version that modifies the list in-place:
 
<langsyntaxhighlight lang="lisp">(delete-if-not #'evenp '(1 2 3 4 5 6 7 8 9 10))
> (2 4 6 8 10)</langsyntaxhighlight>
 
=={{header|Cowgol}}==
<syntaxhighlight lang="cowgol">include "cowgol.coh";
 
# Cowgol has strict typing and there are no templates either.
# Defining the type this way makes it easy to change.
typedef FilterT is uint32;
 
# In order to pass functions around, we need to define an
# interface. The 'FilterPredicate' interface will take an argument
# and return zero if it should be filtered out.
interface FilterPredicate(x: FilterT): (keep: uint8);
 
# Filter an array and store it a new location. Returns the new length.
sub Filter(f: FilterPredicate,
items: [FilterT],
length: intptr,
result: [FilterT]):
(newLength: intptr) is
newLength := 0;
while length > 0 loop
var item := [items];
items := @next items;
if f(item) != 0 then
[result] := item;
result := @next result;
newLength := newLength + 1;
end if;
length := length - 1;
end loop;
end sub;
 
# Filter an array in place. Returns the new length.
sub FilterInPlace(f: FilterPredicate,
items: [FilterT],
length: intptr):
(newLength: intptr) is
newLength := Filter(f, items, length, items);
end sub;
 
# Filter that selects even numbers
sub Even implements FilterPredicate is
keep := (~ x as uint8) & 1;
end sub;
 
# Filter an array
var array: uint32[] := {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
var filtered: uint32[@sizeof array];
var length := Filter(Even, &array[0], @sizeof array, &filtered[0]);
 
# Print result
var i: uint8 := 0;
while i < length as uint8 loop
print_i32(filtered[i]);
print_char(' ');
i := i + 1;
end loop;
print_nl();
 
# Filter the result again in place for numbers less than 8
sub LessThan8 implements FilterPredicate is
if x < 8 then keep := 1;
else keep := 0;
end if;
end sub;
 
length := FilterInPlace(LessThan8, &filtered[0], length);
i := 0;
while i < length as uint8 loop
print_i32(filtered[i]);
print_char(' ');
i := i + 1;
end loop;
print_nl();</syntaxhighlight>
{{out}}
<pre>2 4 6 8 10
2 4 6</pre>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">void main() {
import std.algorithm: filter, equal;
 
Line 697 ⟶ 1,309:
auto evens = data.filter!(x => x % 2 == 0); // Lazy.
assert(evens.equal([2, 4, 6, 8, 10]));
}</langsyntaxhighlight>
===Tango Version===
{{libheader|Tango}}
<langsyntaxhighlight lang="d">import tango.core.Array, tango.io.Stdout;
 
void main() {
Line 709 ⟶ 1,321:
Stdout("Evens - ")( array[0 .. evens] ).newline; // The order of even elements is preserved
Stdout("Odds - ")( array[evens .. $].sort ).newline; // Unlike odd elements
}</langsyntaxhighlight>
{{out}}
<pre> Evens - [ 2, 4, 6, 8, 10 ]
Line 715 ⟶ 1,327:
 
=={{header|Delphi}}==
===Hand-coded version===
<lang Delphi>program FilterEven;
<syntaxhighlight lang="delphi">program FilterEven;
 
{$APPTYPE CONSOLE}
Line 739 ⟶ 1,352:
Write(i:3);
Writeln;
end.</langsyntaxhighlight>
 
=={{header|Déjà Vu}}==
 
===Non-destructivelyUsing Boost.Int library===
<lang dejavu>filter pred lst:
]
for value in copy lst:
if pred @value:
@value
[
 
Alternative using Boost.Int[https://github.com/MaiconSoft/DelphiBoostLib]:
even x:
{{libheader| System.SysUtils}}
= 0 % x 2
{{libheader| Types}}
{{libheader| Boost.Int}}
<syntaxhighlight lang="delphi">program FilterEven;
 
{$APPTYPE CONSOLE}
!. filter @even [ 0 1 2 3 4 5 6 7 8 9 ]</lang>
 
uses
{{out}}
System.SysUtils,
Types,
Boost.Int;
 
var
<pre>[ 0 2 4 6 8 ]</pre>
Source, Destiny: TIntegerDynArray;
 
begin
===Destructively===
<lang dejavu>local :lst Source.Assign([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]);
 
// Non-destructively
filter-destructively pred lst:
Destiny := Source.Filter(
local :tmp []
function(Item: Integer): Boolean
while lst:
begin
pop-from lst
Result := not odd(Item) and (Item <> 0);
if pred dup:
end);
push-to tmp
else:
drop
while tmp:
push-to lst pop-from tmp
 
Writeln('[' + Destiny.Comma + ']');
filter-destructively @even lst
Readln;
end.
 
// Destructively
!. lst</lang>
Source.Remove(
function(Item: Integer): Boolean
begin
Result := odd(Item) or (Item = 0);
end);
 
Writeln('[' + Source.Comma + ']');
End.
</syntaxhighlight>
 
{{out}}
<pre>
 
<pre>[ 0 2 ,4 ,6 ,8 ]</pre>
[2,4,6,8]
</pre>
 
=={{header|Dyalect}}==
 
===Non-destructively===
<langsyntaxhighlight Dyalectlang="dyalect">func Array.filterFilter(pred) {
var arr = []
for x in this when pred(x) {
arr.addAdd(x)
}
arr
}
 
var arr = [1..20].filterFilter(x => x % 2 == 0)
print(arr)</langsyntaxhighlight>
 
{{out}}
Line 801 ⟶ 1,423:
 
===Destructively===
<langsyntaxhighlight Dyalectlang="dyalect">func Array.filterFilter(pred) {
var i = 0
while i < this.lenLength() {
if !pred(this[i]) {
this.removeAtRemoveAt(i)
}
i += 1
Line 812 ⟶ 1,434:
 
var arr = [1..20]
arr.filterFilter(x => x % 2 == 0)
print(arr)</langsyntaxhighlight>
 
{{out}}
Line 823 ⟶ 1,445:
Idiomatic approach in Dy is to use non-strict iterators (which can be combined without intermedate data structures) and translate the result to an array if needed:
 
<syntaxhighlight lang="dyalect">var xs = [1..20]
<lang Dyalect>func Iterator.filter(pred) {
var arr = xs.Iterate().Filter(x => x % 2 == 0).Map(x => x.ToString())
for x in this when pred(x) {
print(arr.ToArray())</syntaxhighlight>
yield x
}
}
 
{{out}}
func Iterator.select(proj) {
for x in this {
yield proj(x)
}
}
 
<pre>["2", "4", "6", "8", "10", "12", "14", "16", "18", "20"]</pre>
var xs = [1..20]
 
var arr = xs.iter().filter($0 % 2 == 0).select($0.toString())
=={{header|Déjà Vu}}==
print(arr.toArray())</lang>
 
===Non-destructively===
<syntaxhighlight lang="dejavu">filter pred lst:
]
for value in copy lst:
if pred @value:
@value
[
 
even x:
= 0 % x 2
 
!. filter @even [ 0 1 2 3 4 5 6 7 8 9 ]</syntaxhighlight>
 
{{out}}
 
<pre>[" 0 2", "4", "6", "8", "10", "12", "14", "16", "18", "20"]</pre>
 
===Destructively===
<syntaxhighlight lang="dejavu">local :lst [ 0 1 2 3 4 5 6 7 8 9 ]
 
filter-destructively pred lst:
local :tmp []
while lst:
pop-from lst
if pred dup:
push-to tmp
else:
drop
while tmp:
push-to lst pop-from tmp
 
filter-destructively @even lst
 
!. lst</syntaxhighlight>
 
{{out}}
 
<pre>[ 0 2 4 6 8 ]</pre>
 
=={{header|E}}==
Line 847 ⟶ 1,498:
There are several ways this could be done.
 
<langsyntaxhighlight lang="e">pragma.enable("accumulator")
accum [] for x ? (x %% 2 <=> 0) in [1,2,3,4,5,6,7,8,9,10] { _.with(x) }</langsyntaxhighlight>
 
<langsyntaxhighlight lang="e">var result := []
for x ? (x %% 2 <=> 0) in [1,2,3,4,5,6,7,8,9,10] {
result with= x
}
result</langsyntaxhighlight>
 
<syntaxhighlight lang="e">def makeSeries := <elang:control.makeSeries>
makeSeries([1,2,3,4,5,6,7,8,9,10]).filter(fn x,_{x %% 2 <=> 0}).asList()</syntaxhighlight>
 
=={{header|EasyLang}}==
 
<syntaxhighlight lang="text">
<lang e>def makeSeries := <elang:control.makeSeries>
a[] = [ 1 2 3 4 5 6 7 8 9 ]
makeSeries([1,2,3,4,5,6,7,8,9,10]).filter(fn x,_{x %% 2 <=> 0}).asList()</lang>
for i = 1 to len a[]
if a[i] mod 2 = 0
b[] &= a[i]
.
.
print b[]
</syntaxhighlight>
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="scheme">
(iota 12) → { 0 1 2 3 4 5 6 7 8 9 10 11 }
 
Line 878 ⟶ 1,541:
→ (0 2 4 6 8 10 12 14 16 18 20 22)
 
</syntaxhighlight>
</lang>
 
 
=={{header|Ela}}==
Line 885 ⟶ 1,547:
===Using higher-order function (non-strict version)===
 
<langsyntaxhighlight lang="ela">open list
 
evenList = filter' (\x -> x % 2 == 0) [1..]</langsyntaxhighlight>
 
===Using comprehension (non-strict version)===
 
<langsyntaxhighlight lang="ela">evenList = [& x \\ x <- [1..] | x % 2 == 0]</langsyntaxhighlight>
 
=={{header|Elena}}==
ELENA 5.0 :
<langsyntaxhighlight lang="elena">import system'routines;
import system'math;
import extensions;
import extensions'routines;
 
public program()
{
auto array := new int[]{1,2,3,4,5};
 
var evens := array.filterBy::(n => n.mod:(2) == 0).toArray();
 
evens.forEach:(printingLn)
}</langsyntaxhighlight>
Using strong typed collections and extensions:
<langsyntaxhighlight lang="elena">import system'collections;
import system'routines'stex;
import system'math;
import extensions;
 
public program()
{
int[] array := new int[]{1,2,3,4,5};
 
array
.filterBy::(int n => n.mod:(2) == 0)
.forEach::(int i){ console.printLine(i) }
}</langsyntaxhighlight>
{{out}}
<pre>
Line 928 ⟶ 1,591:
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">iex(10)> numbers = Enum.to_list(1..9)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
iex(11)> Enum.filter(numbers, fn x -> rem(x,2)==0 end)
[2, 4, 6, 8]
iex(12)> for x <- numbers, rem(x,2)==0, do: x # comprehension
[2, 4, 6, 8]</langsyntaxhighlight>
 
 
=={{header|Emacs Lisp}}==
{{trans|Common_Lisp}}
<syntaxhighlight lang="lisp">
(seq-filter (lambda (x) (= (% x 2))) '(1 2 3 4 5 6 7 8 9 10))
</syntaxhighlight>
 
{{out}}
 
<pre>
(2 4 6 8 10)
</pre>
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
writeLine(range(1, 11).filter(<int i|i % 2 == 0))
</syntaxhighlight>
{{out}}
<pre>
[2,4,6,8,10]
</pre>
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">Numbers = lists:seq(1, 5).
EvenNumbers = lists:filter(fun (X) -> X rem 2 == 0 end, Numbers).</langsyntaxhighlight>
 
Or using a list comprehension:
 
<langsyntaxhighlight lang="erlang">EvenNumbers = [X || X <- Numbers, X rem 2 == 0].</langsyntaxhighlight>
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">sequence s, evens
s = {1, 2, 3, 4, 5, 6}
evens = {}
Line 952 ⟶ 1,637:
end if
end for
? evens</langsyntaxhighlight>
 
{{out}}
Line 959 ⟶ 1,644:
 
=={{header|F Sharp|F#}}==
<langsyntaxhighlight lang="fsharp">let lst = [1;2;3;4;5;6]
List.filter (fun x -> x % 2 = 0) lst;;
 
val it : int list = [2; 4; 6]</langsyntaxhighlight>
 
=={{header|Factor}}==
Line 968 ⟶ 1,653:
This code uses ''filter'' on an array.
 
<langsyntaxhighlight lang="factor">10 <iota> >array [ even? ] filter .
! prints { 0 2 4 6 8 }</langsyntaxhighlight>
 
''10 <iota>'' is already a sequence, so we can skip the conversion to array.
 
<langsyntaxhighlight lang="factor">10 <iota> [ even? ] filter .
! prints V{ 0 2 4 5 8 }</langsyntaxhighlight>
 
=== Destructive ===
This uses ''filter!'' to modify the original vector.
 
<langsyntaxhighlight lang="factor">USE: vectors
10 <iota> >vector [ even? ] filter! .
! prints V{ 0 2 4 5 8 }</langsyntaxhighlight>
 
To prove that ''filter!'' is destructive but ''filter'' is non-destructive, I assign the original vector to ''v''.
 
<langsyntaxhighlight lang="factor">USE: locals
10 <iota> >vector [| v |
v [ even? ] filter drop
Line 993 ⟶ 1,678:
] call
! V{ 0 1 2 3 4 5 6 7 8 9 } after filter
! V{ 0 2 4 6 8 } after filter!</langsyntaxhighlight>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
class Main
{
Line 1,009 ⟶ 1,694:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Fe}}==
<syntaxhighlight lang="clojure">
(= filter (fn (f lst)
(let res (cons nil nil))
(let tail res)
(while lst
(let item (car lst))
(if (f item) (do
(setcdr tail (cons item nil))
(= tail (cdr tail))))
(= lst (cdr lst)))
(cdr res)))
 
(print (filter (fn (x) (< 5 x)) '(1 4 5 6 3 2 7 9 0 8)))
</syntaxhighlight>
Outputs:
<syntaxhighlight lang="clojure">
(6 7 9 8)
</syntaxhighlight>
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: sel ( dest 0 test src len -- dest len )
cells over + swap do ( dest len test )
i @ over execute if
Line 1,028 ⟶ 1,732:
: even? ( n -- ? ) 1 and 0= ;
 
evens 0 ' even? nums 6 sel .array \ 2 4 6</langsyntaxhighlight>
 
 
=={{header|Fortran}}==
 
<langsyntaxhighlight lang="fortran">module funcs
implicit none
contains
Line 1,041 ⟶ 1,744:
iseven = mod(x, 2) == 0
end function iseven
end module funcs</langsyntaxhighlight>
 
<langsyntaxhighlight lang="fortran">program Filter
use funcs
implicit none
Line 1,059 ⟶ 1,762:
 
contains
 
function filterwith(ar, testfunc)
integer, dimension(:), pointer :: filterwith
Line 1,085 ⟶ 1,788:
end function filterwith
 
end program Filter</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Type FilterType As Function(As Integer) As Boolean
 
Function isEven(n As Integer) As Boolean
Return n Mod 2 = 0
End Function
 
Line 1,106 ⟶ 1,809:
End If
Next
 
If count > 0 Then Redim Preserve b(0 To count - 1) '' trim excess elements
End Sub
Line 1,122 ⟶ 1,825:
count += 1
i -= 1
End If
Next i
 
If count > 0 Then
Redim Preserve da(LBound(da) To UBound(da) - count) '' trim excess elements
End If
End Sub
 
Dim n As Integer = 12
Dim a(1 To n) As Integer '' creates dynamic array as upper bound is a variable
Line 1,150 ⟶ 1,853:
End
 
Data 1, 2, 3, 7, 8, 10, 11, 16, 19, 21, 22, 27</langsyntaxhighlight>
 
{{out}}
Line 1,160 ⟶ 1,863:
 
=={{header|Frink}}==
<langsyntaxhighlight lang="frink">
b = array[1 to 100]
c = select[b, {|x| x mod 2 == 0}]
</syntaxhighlight>
</lang>
 
=={{header|Futhark}}==
{{incorrect|Futhark|Futhark's syntax has changed, so this example will not compile}}
 
<syntaxhighlight lang="futhark">
<lang Futhark>
fun main(as: []int): []int =
filter (fn x => x%2 == 0) as
</syntaxhighlight>
</lang>
 
=={{header|FutureBasic}}==
Even elements from array added to new array.
<syntaxhighlight lang="futurebasic">
include "NSLog.incl"
 
local fn EvenNumbersFromArrayToNewArray
CFArrayRef numbersArray = @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12]
PredicateRef isEvenPred = fn PredicateWithFormat( @"modulus:by:(SELF, 2) == 0" )
CFArrayRef evensArray = fn ArrayFilteredArrayUsingPredicate( numbersArray, isEvenPred )
NSLog( @"Array of odd and even numbers before sort:\n\t%@\n", numbersArray )
NSLog( @"New array of even numbers after sort:\n\t%@\n", evensArray )
end fn
fn EvenNumbersFromArrayToNewArray
NSLogScrollToTop
</syntaxhighlight>
Destructive version: Odd elemnts removed from mutable array.
<syntaxhighlight>
local fn OddNumbersRemovedFromArray
CFMutablearrayRef mutableNumbersArray = fn MutableArrayWithArray( @[@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12] )
NSLog( @"Mutable array of odd and even numbers before sort:\n\t%@\n", mutableNumbersArray )
PredicateRef isEvenPred = fn PredicateWithFormat( @"modulus:by:(SELF, 2) == 0" )
MutableArrayFilterUsingPredicate( mutableNumbersArray, isEvenPred )
NSLog( @"Mutable array with odd numbers removed:\n\t%@\n", mutableNumbersArray )
end fn
 
fn OddNumbersRemovedFromArray
NSLogScrollToTop
 
HandleEvents
</syntaxhighlight>
{{output}}
<pre style="height:20ex;">
 
Array of odd and even numbers before sort:
(
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12
)
 
New array of even numbers after sort:
(
2,
4,
6,
8,
10,
12
)
 
Mutable array of odd and even numbers before sort:
(
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12
)
 
Mutable array with odd numbers removed:
(
2,
4,
6,
8,
10,
12
)
</pre>
 
 
 
 
=={{header|Gambas}}==
'''[https://gambas-playground.proko.eu/?gist=e73bc5db1e3bb56c598f89aa669a0825 Click this link to run this code]'''
<langsyntaxhighlight lang="gambas">sRandom As New String[]
'______________________________________________________________________________________________________
Public Sub Main()
Line 1,217 ⟶ 2,009:
Print sRandom.join(",")
 
End</langsyntaxhighlight>
Output:
<pre>
Line 1,226 ⟶ 2,018:
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap"># Built-in
 
Filtered([1 .. 100], IsPrime);
# [ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 ]
 
Filtered([1 .. 10], IsEvenInt);
# [ 2, 4, 6, 8, 10 ]
 
Filtered([1 .. 10], IsOddInt);
# [ 1, 3, 5, 7, 9 ]</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,277 ⟶ 2,069:
}
*pa = a[:last]
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,288 ⟶ 2,080:
 
=={{header|Groovy}}==
<langsyntaxhighlight lang="groovy"> def evens = [1, 2, 3, 4, 5].findAll{it % 2 == 0}</langsyntaxhighlight>
 
=={{header|Haskell}}==
Line 1,294 ⟶ 2,086:
In Haskell, a list is often more basic than an array:
 
<langsyntaxhighlight lang="haskell">ary = [1..10]
evens = [x | x <- ary, even x]</langsyntaxhighlight>
or
<langsyntaxhighlight lang="haskell">evens = filter even ary</langsyntaxhighlight>
 
To do the same operation on an array, the simplest way it to convert it lazily into a list:
 
<langsyntaxhighlight lang="haskell">import Data.Array
 
ary = listArray (1,10) [1..10]
evens = listArray (1,n) l where
n = length l
l = [x | x <- elems ary, even x]</langsyntaxhighlight>
 
Note that the bounds must be known before creating the array, so the temporary list will be fully evaluated before the array is created.
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main()
 
every put(A := [],1 to 10) # make a list of 1..10
Line 1,320 ⟶ 2,112:
procedure iseven(x) #: return x if x is even or fail
if x % 2 = 0 then return x
end</langsyntaxhighlight>
 
=={{header|IDL}}==
The <tt>where()</tt> function can select elements on any logical expression. For example
 
<langsyntaxhighlight lang="idl">result = array[where(NOT array AND 1)]</langsyntaxhighlight>
 
=={{header|Insitux}}==
<syntaxhighlight lang="insitux">> (filter even? [0 1 2 3 4])
[0 2 4]
 
> (var x [0 1 2 3 4])
[0 1 2 3 4]
 
> (var! x (filter even?)) ;replaces variable x by applying implicit closure
[0 2 4]
</syntaxhighlight>
 
=={{header|J}}==
'''Solution:'''<br>
With any verb (function) <code>f</code> that returns a boolean for each element of a vector <code>v</code>, the following is the generic solution:
<langsyntaxhighlight lang="j"> (#~ f) v</langsyntaxhighlight>
 
'''Examples:'''
<langsyntaxhighlight lang="j"> ] v=: 20 ?@$ 100 NB. vector of 20 random integers between 0 and 99
63 92 51 92 39 15 43 89 36 69 40 16 23 2 29 91 57 43 55 22
 
v #~ -.2| v
92 92 36 40 16 2 22</langsyntaxhighlight>
 
Or using the generic form suggested above:
<langsyntaxhighlight lang="j"> isEven=: 0 = 2&| NB. verb testing for even numbers
(#~ isEven) v
92 92 36 40 16 2 22</langsyntaxhighlight>
 
We might decide that we use this pattern so often that it is worthwhile creating a new adverb <code>select</code> that filters an array using the verb to its left.
<langsyntaxhighlight lang="j"> select=: adverb def '(#~ u)'
isPrime=: 1&p:
 
Line 1,353 ⟶ 2,156:
43 89 23 2 29 43
(isEven *. isPrime) select v
2</langsyntaxhighlight>
 
Destructive example:
 
<langsyntaxhighlight lang="j"> v=: isEven select v</langsyntaxhighlight>
 
(That said, note that in a highly parallel computing environment the destruction either happens after the filtering or you have to repeatedly stall the filtering to ensure that some sort of partially filtered result has coherency.)
 
=={{header|Jakt}}==
<syntaxhighlight lang="jakt">
fn filter<T>(anon array: [T], anon filter_function: fn(anon value: T) -> bool) throws -> [T] {
mut result: [T] = []
for value in array {
if filter_function(value) {
result.push(value)
}
}
return result
}
 
fn main() {
mut numbers: [i64] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let filtered = filter(numbers, fn(anon x: i64) -> bool => x % 2 == 0)
println("{}", filtered)
}
</syntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">int[] array = {1, 2, 3, 4, 5 };
List<Integer> evensList = new ArrayList<Integer>();
for (int i: array) {
if (i % 2 == 0) evensList.add(i);
}
int[] evens = evensList.toArray(new int[0]);</langsyntaxhighlight>
 
----
 
A Java 8 solution with stream and generic types:
<langsyntaxhighlight lang="java">public static <T> T[] filter(T[] input, Predicate<T> filterMethod) {
return Arrays.stream(input)
.filter(filterMethod)
.toArray(size -> (T[]) Array.newInstance(input.getClass().getComponentType(), size));
}</langsyntaxhighlight>
Methodcall:
<langsyntaxhighlight lang="java">Integer[] array = {1, 2, 3, 4, 5};
Integer[] result = filter(array, i -> (i % 2) == 0);</langsyntaxhighlight>
Warning: This solution works not with primitive types!<br/>
For arrays with a primitive type use the wrapper class.
 
=={{header|JavaFX Script}}==
<langsyntaxhighlight lang="javafx">def array = [1..100];
def evens = array[n | n mod 2 == 0];</langsyntaxhighlight>
 
=={{header|JavaScript}}==
===ES5===
The standard way is to use the [https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/filter Array.prototype.filter] function ({{works with|JavaScript|1.6}}):
<langsyntaxhighlight lang="javascript">var arr = [1,2,3,4,5];
var evens = arr.filter(function(a) {return a % 2 == 0});</langsyntaxhighlight>
 
Other ways:
<langsyntaxhighlight lang="javascript">var arr = [1,2,3,4,5];
var evens = [];
for (var i=0, ilen=arr.length; i<ilen; i++)
if (arr[i] % 2 == 0)
evens.push(arr[i]);</langsyntaxhighlight>
 
{{works with|Firefox|2.0}}
 
<langsyntaxhighlight lang="javascript">var numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var evens = [i for (i in numbers) if (i % 2 == 0)];
 
Line 1,411 ⟶ 2,233:
}
 
var evens2 = [i for (i in range(100)) if (i % 2 == 0)];</langsyntaxhighlight>
 
{{libheader|Functional}}
<langsyntaxhighlight lang="javascript">Functional.select("+1&1", [1,2,3,4]) // [2, 4]</langsyntaxhighlight>
 
===ES6===
 
<langsyntaxhighlight JavaScriptlang="javascript">(() => {
'use strict';
 
Line 1,426 ⟶ 2,248:
 
// TEST
 
return [1,2,3,4,5,6,7,8,9]
.filter(isEven);
 
// [2, 4, 6, 8]
})();</langsyntaxhighlight>
 
{{Out}}
<langsyntaxhighlight JavaScriptlang="javascript">[2, 4, 6, 8]</langsyntaxhighlight>
 
=={{header|Joy}}==
<syntaxhighlight lang="joy">[1 2 3 4 5 6 7 8 9 10] [2 rem null] filter.</syntaxhighlight>
 
=={{header|jq}}==
jq's "select" filter is designed to make it easy to filter both arrays and streams:
<langsyntaxhighlight lang="jq">(1,2,3,4,5,6,7,8,9) | select(. % 2 == 0)</langsyntaxhighlight>
{{Out}}
2
Line 1,444 ⟶ 2,269:
6
8
<syntaxhighlight lang="jq">
<lang jq>
[range(1;10)] | map( select(. % 2 == 0) )
</syntaxhighlight>
</lang>
{{Out}}
[2,4,6,8]
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
 
<langsyntaxhighlight lang="julia">@show filter(iseven, 1:10)</langsyntaxhighlight>
 
{{out}}
Line 1,458 ⟶ 2,284:
 
=={{header|K}}==
<langsyntaxhighlight Klang="k"> / even is a boolean function
even:{0=x!2}
even 1 2 3 4 5
Line 1,469 ⟶ 2,295:
/ as a function
evens:{x@&even'x}
a:10?100
45 5 79 77 44 15 83 88 33 99
evens a
44 88</langsyntaxhighlight>
 
Alternative syntax:
<langsyntaxhighlight Klang="k"> {x[&0=x!2]}
{x[&even x]}</langsyntaxhighlight>
 
Destructive:
<langsyntaxhighlight Klang="k"> a:evens a
44 88</langsyntaxhighlight>
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.5-2
 
fun main(args: Array<String>) {
Line 1,495 ⟶ 2,321:
mutableList.retainAll { it % 2 == 0 }
println(mutableList.joinToString(" "))
}</langsyntaxhighlight>
 
{{out}}
Line 1,502 ⟶ 2,328:
2 4 6 8
2 4 6 8
</pre>
 
=={{header|Lambdatalk}}==
 
<syntaxhighlight lang="scheme">
 
{def filter
{lambda {:bool :s}
{:bool {S.first :s}}
{if {> {S.length :s} 1}
then {filter :bool {S.rest :s}}
else}}}
-> filter
 
{def even? {lambda {:n} {if {= {% :n 2} 0} then :n else}}}
-> even?
{def odd? {lambda {:n} {if {= {% :n 2} 1} then :n else}}}
-> odd?
 
{filter even? {S.serie 1 20}}
-> 2 4 6 8 10 12 14 16 18 20
{filter odd? {S.serie 1 20}}
-> 1 3 5 7 9 11 13 15 17 19
 
</syntaxhighlight>
 
=={{header|Lang}}==
Solution with isEven function:
<syntaxhighlight lang="lang">
&arr = fn.arrayGenerateFrom(fn.inc, 10)
fp.isEven = ($x) -> return parser.op($x % 2 === 0)
&filteredArr = fn.arrayFiltered(&arr, fp.isEven)
fn.println(&arr)
fn.println(&filteredArr)
</syntaxhighlight>
{{out}}
<pre>
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 10]
</pre>
Solution with combinator functions:
<syntaxhighlight lang="lang">
&arr = fn.arrayGenerateFrom(fn.inc, 10)
&filteredArr = fn.arrayFiltered(&arr, fn.combC(fn.combX1(fn.conStrictEquals, fn.combC(fn.mod, 2)), 0))
fn.println(&arr)
fn.println(&filteredArr)
</syntaxhighlight>
{{out}}
<pre>
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[2, 4, 6, 8, 10]
</pre>
 
=={{header|Lang5}}==
<langsyntaxhighlight lang="lang5">: filter over swap execute select ;
10 iota "2 % not" filter . "\n" .
 
# [ 0 2 4 6 8 ]</langsyntaxhighlight>
 
 
=={{header|langur}}==
Using the wherefilter() function filters by a function or regex and returns values.a Usinglist wherekeys()of filters the same way, but returns keys insteadvalues.
 
<syntaxhighlight lang="langur">val .list = series 7
{{works with|langur|0.8.1}}
<lang langur>val .arr = series 7
 
writeln " array list: ", .arrlist
writeln "filtered: ", where f .xfilter fn{div 2}, .arr</lang>list
</syntaxhighlight>
 
{{out}}
<pre> array list: [1, 2, 3, 4, 5, 6, 7]
filtered: [2, 4, 6]</pre>
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">local(original = array(1,2,3,4,5,6,7,8,9,10))
local(evens = (with item in #original where #item % 2 == 0 select #item) -> asstaticarray)
#evens</langsyntaxhighlight>
<pre>staticarray(2, 4, 6, 8, 10)</pre>
 
Modifying the original array
<langsyntaxhighlight lang=" lasso">local(original = array(1,2,3,4,5,6,7,8,9,10))
with item in #original where #item % 2 != 0 do #original ->removeall(#item)
#original</langsyntaxhighlight>
<pre>array(2, 4, 6, 8, 10)</pre>
 
=={{header|Liberty BASIC}}==
<langsyntaxhighlight lang="lb">' write random nos between 1 and 100
' to array1 counting matches as we go
dim array1(100)
Line 1,557 ⟶ 2,433:
for n=1 to count
print array2(n)
next</langsyntaxhighlight>
 
=={{header|Lisaac}}==
<langsyntaxhighlight Lisaaclang="lisaac">+ a, b : ARRAY[INTEGER];
a := ARRAY[INTEGER].create_with_capacity 10 lower 0;
b := ARRAY[INTEGER].create_with_capacity 10 lower 0;
Line 1,570 ⟶ 2,446:
b.add_last item;
};
};</langsyntaxhighlight>
 
=={{header|Logo}}==
<langsyntaxhighlight lang="logo">to even? :n
output equal? 0 modulo :n 2
end
show filter "even? [1 2 3 4] ; [2 4]
 
show filter [equal? 0 modulo ? 2] [1 2 3 4]</langsyntaxhighlight>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function filter(t, func)
local ret = {}
for i, v in ipairs(t) do
Line 1,590 ⟶ 2,467:
function even(a) return a % 2 == 0 end
 
print(unpack(filter({1, 2, 3, 4 ,5, 6, 7, 8, 9, 10}, even)))</langsyntaxhighlight>
 
The destructive version is even simpler, since tables are passed by reference:
 
<langsyntaxhighlight lang="lua">function filter(t, func)
for i, v in ipairs(t) do
if not func(v) then table.remove(t, i) end
Line 1,604 ⟶ 2,481:
local values = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
filter(values, even)
print(unpack(values))</langsyntaxhighlight>
 
=={{header|M2000 Interpreter}}==
===Using Filter for arrays===
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
Print (1,2,3,4,5,6,7,8)#filter(lambda ->number mod 2=0)
}
Checkit
</syntaxhighlight>
</lang>
 
===Old style===
Line 1,626 ⟶ 2,503:
 
 
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
Function GetEvenNumbers (A as array){
Line 1,638 ⟶ 2,515:
=Array([])
}
 
Dim A(5), B()
A(0)=10,3,6,7,11
Line 1,644 ⟶ 2,521:
Print B() ' print 10,6
Print GetEvenNumbers((1,2,3,4,5,6,7,8)) ' 2 4 6 8
 
Module Filter2EvenNumbers (&A()) {
If len(A())=0 then exit
Line 1,673 ⟶ 2,550:
A(0)=10,3,6,7,11
Filter2EvenNumbers &A()
Print A() ' 10 6
}
CheckIt
}
CheckIt
</syntaxhighlight>
</lang>
 
=={{header|Maple}}==
<syntaxhighlight lang="maple">
<lang Maple>
evennum:=proc(nums::list(integer))
return select(x->type(x, even), nums);
end proc;
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
Check for even integers:
<langsyntaxhighlight Mathematicalang="mathematica">Select[{4, 5, Pi, 2, 1.3, 7, 6, 8.0}, EvenQ]</langsyntaxhighlight>
gives:
<syntaxhighlight lang Mathematica="mathematica">{4, 2, 6}</langsyntaxhighlight>
To check also for approximate number (like 8.0 in the example above) a possible solution is:
<langsyntaxhighlight Mathematicalang="mathematica">Select[{4, 5, Pi, 2, 1.3, 7, 6, 8.0}, Mod[#, 2] == 0 &]</langsyntaxhighlight>
gives:
<langsyntaxhighlight Mathematicalang="mathematica">{4, 2, 6, 8.}</langsyntaxhighlight>
notice that the function returns 8. not 8 (the dot indicates that it is a float number, not an integer).
 
=={{header|MATLAB}}==
<langsyntaxhighlight MATLABlang="matlab">function evens = selectEvenNumbers(list)
 
evens = list( mod(list,2) == 0 );
 
end</langsyntaxhighlight>
 
{{out}}
<langsyntaxhighlight MATLABlang="matlab">>> selectEvenNumbers([0 1 2 3 4 5 6 7 8 9 10])
 
ans =
 
0 2 4 6 8 10</langsyntaxhighlight>
 
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">a: makelist(i, i, 1, 20);
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
 
Line 1,721 ⟶ 2,597:
 
sublist(a, lambda([n], mod(n, 3) = 0));
[3, 6, 9, 12, 15, 18]</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">arr = #(1, 2, 3, 4, 5, 6, 7, 8, 9)
newArr = for i in arr where (mod i 2 == 0) collect i</langsyntaxhighlight>
 
=={{header|min}}==
{{works with|min|0.19.3}}
<langsyntaxhighlight lang="min">(1 2 3 4 5 6 7 8 9 10) 'even? filter print</langsyntaxhighlight>
{{out}}
<pre>
Line 1,737 ⟶ 2,613:
=={{header|MiniScript}}==
We define a ''filter'' method on the list type that returns a new list containing elements filtered by the given function.
<langsyntaxhighlight MiniScriptlang="miniscript">list.filter = function(f)
result = []
for item in self
Line 1,750 ⟶ 2,626:
 
nums = [1, 2, 3, 4, 5, 6, 7, 9, 12, 15, 18, 21]
print nums.filter(@isEven)</langsyntaxhighlight>
 
The in-place version is simpler, and even allows the use of an unnamed filter function, defined right on the method call.
<langsyntaxhighlight MiniScriptlang="miniscript">list.filterInPlace = function(f)
for i in range(self.len-1, 0)
if not f(self[i]) then self.remove i
Line 1,765 ⟶ 2,641:
end function
 
print nums</langsyntaxhighlight>
 
=={{header|ML}}==
==={{header|Standard ML}}===
<langsyntaxhighlight lang="sml">val ary = [1,2,3,4,5,6];
List.filter (fn x => x mod 2 = 0) ary</langsyntaxhighlight>
==={{header|MLite}}===
MLite is similar to Standard ML, though '=>' becomes '=' and 'List.' is elided:
<langsyntaxhighlight lang="ocaml">val ary = [1,2,3,4,5,6];
filter (fn x = x mod 2 = 0) ary;</langsyntaxhighlight>
 
=={{header|MUMPS}}==
<langsyntaxhighlight MUMPSlang="mumps">FILTERARRAY
;NEW I,J,A,B - Not making new, so we can show the values
;Populate array A
Line 1,783 ⟶ 2,659:
;Move even numbers into B
SET J=0 FOR I=1:1:10 SET:A(I)#2=0 B($INCREMENT(J))=A(I)
QUIT</langsyntaxhighlight>
Testing:<pre>WRITE
 
Line 1,806 ⟶ 2,682:
=={{header|Nemerle}}==
Lists have a built-in method for filtering:
<langsyntaxhighlight Nemerlelang="nemerle">def original = $[1 .. 100];
def filtered = original.Filter(fun(n) {n % 2 == 0});
WriteLine($"$filtered");</langsyntaxhighlight>
The following would work for arrays:
<langsyntaxhighlight Nemerlelang="nemerle">Filter[T] (a : array[T], f : T -> bool) : array[T]
{
def b = $[x | x in a, (f(x))];
b.ToArray()
}</langsyntaxhighlight>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
numeric digits 5000
Line 1,834 ⟶ 2,710:
sd1 = Rexx[]
sd2 = Rexx[]
 
say 'Test data:'
sd1 = makeSampleData(100)
Line 1,880 ⟶ 2,756:
ry = Rexx[] clist.toArray(Rexx[clist.size()])
return ry
</syntaxhighlight>
</lang>
{{out}}
<pre>
Test data:
--------------------------------------------------------------------------------
-24.5 -24 -23.5 -23 -22.5 -22 -21.5 -21 -20.5 -20 -19.5 -19 -18.5 -18 -17.5 -17 -16.5 -16 -15.5 -15 -14.5 -14 -13.5 -13 -12.5 -12 -11.5 -11 -10.5 -10 -9.5 -9 -8.5 -8 -7.5 -7 -6.5 -6 -5.5 -5 -4.5 -4 -3.5 -3 -2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8 8.5 9 9.5 10 10.5 11 11.5 12 12.5 13 13.5 14 14.5 15 15.5 16 16.5 17 17.5 18 18.5 19 19.5 20 20.5 21 21.5 22 22.5 23 23.5 24 24.5 25
 
Option 1 (copy to a new array):
--------------------------------------------------------------------------------
-24 -22 -20 -18 -16 -14 -12 -10 -8 -6 -4 -2 0 2 4 6 8 10 12 14 16 18 20 22 24
 
Option 2 (replace the original array):
Line 1,897 ⟶ 2,773:
 
=={{header|NewLISP}}==
<langsyntaxhighlight NewLISPlang="newlisp">> (filter (fn (x) (= (% x 2) 0)) '(1 2 3 4 5 6 7 8 9 10))
(2 4 6 8 10)
</syntaxhighlight>
</lang>
 
=={{header|NGS}}==
<syntaxhighlight lang="ngs">F even(x:Int) x % 2 == 0
 
evens = Arr(1...10).filter(even)</syntaxhighlight>
 
=={{header|Nial}}==
<langsyntaxhighlight lang="nial">filter (= [0 first, mod [first, 2 first] ] ) 0 1 2 3 4 5 6 7 8 9 10
=0 2 4 6 8 10</langsyntaxhighlight>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import sequtils
 
let values = @[toSeq(0,1,2,3,4,5,6,7,8,..9])
 
# Filtering by returning a new sequence.
let evens = values.filter(proc (x: int): bool = x mod 2 == 0)
# - using an explicit filtering procedure.
echo "Even values: ", values.filter(proc(x: int): bool = x mod 2 == 0)
# - using a predicate.
echo "Odd values: ", values.filterIt(it mod 2 == 1)
 
# Filtering by modifying the sequence.
let odds = values.filterIt(it mod 2 == 1)</lang>
# - using an explicit filtering procedure.
var v1 = toSeq(0..9)
v1.keepIf(proc(x: int): bool = x mod 2 == 0)
echo "Even values: ", v1
# - using a predicate.
var v2 = toSeq(0..9)
v2.keepItIf(it mod 2 != 0)
echo "Odd values: ", v2</syntaxhighlight>
 
{{out}}
<pre>Even values: @[0, 2, 4, 6, 8]
Odd values: @[1, 3, 5, 7, 9]
Even values: @[0, 2, 4, 6, 8]
Odd values: @[1, 3, 5, 7, 9]</pre>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
use Structure;
 
Line 1,935 ⟶ 2,834:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Objective-C}}==
{{works with|Cocoa|Mac OS X 10.6+}}
<langsyntaxhighlight lang="objc">NSArray *numbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
Line 1,945 ⟶ 2,844:
[NSNumber numberWithInt:5], nil];
NSArray *evens = [numbers objectsAtIndexes:[numbers indexesOfObjectsPassingTest:
^BOOL(id obj, NSUInteger idx, BOOL *stop) { return [obj intValue] % 2 == 0; } ]];</langsyntaxhighlight>
 
{{works with|Cocoa|Mac OS X 10.5+}}
<langsyntaxhighlight lang="objc">NSArray *numbers = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
[NSNumber numberWithInt:2],
[NSNumber numberWithInt:3],
Line 1,954 ⟶ 2,853:
[NSNumber numberWithInt:5], nil];
NSPredicate *isEven = [NSPredicate predicateWithFormat:@"modulus:by:(SELF, 2) == 0"];
NSArray *evens = [numbers filteredArrayUsingPredicate:isEven];</langsyntaxhighlight>
 
{{works with|GNUstep}}
<langsyntaxhighlight lang="objc">#import <Foundation/Foundation.h>
 
@interface NSNumber ( ExtFunc )
Line 1,982 ⟶ 2,881:
NSPredicate *isEven = [NSPredicate predicateWithFormat:@"modulo2 == 0"];
NSArray *evens = [numbers filteredArrayUsingPredicate:isEven];
 
NSLog(@"%@", evens);
 
Line 1,988 ⟶ 2,887:
[pool release];
return 0;
}</langsyntaxhighlight>
 
=={{header|OCaml}}==
It is easier to do it with a list:
<langsyntaxhighlight lang="ocaml">let lst = [1;2;3;4;5;6]
let even_lst = List.filter (fun x -> x mod 2 = 0) lst</langsyntaxhighlight>
 
=={{header|Octave}}==
<langsyntaxhighlight lang="octave">arr = [1:100];
evennums = arr( mod(arr, 2) == 0 );
disp(evennums);</langsyntaxhighlight>
 
=={{header|Oforth}}==
 
<syntaxhighlight lang Oforth="oforth">100 seq filter(#isEven)</langsyntaxhighlight>
 
=={{header|Ol}}==
<syntaxhighlight lang="scheme">
(filter even? '(1 2 3 4 5 6 7 8 9 10))
</syntaxhighlight>
=={{header|ooRexx}}==
<langsyntaxhighlight lang="oorexx"> Call random ,,1234567
a=.array~new
b=.array~new
Line 2,035 ⟶ 2,938:
Say 'Filtered values (destructive filtering):' a~makestring(line,' ')
Exit
filter: Return arg(1)//2=0</langsyntaxhighlight>
{{out}}
<pre>Unfiltered values: 1412 2244 6778 4002 439 3335 5877 8273 7882 1469
Line 2,043 ⟶ 2,946:
=={{header|Oz}}==
It is easier to do it with a list:
<langsyntaxhighlight lang="oz">declare
Lst = [1 2 3 4 5]
LstEven = {Filter Lst IsEven}</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
{{PARI/GP select}}
<langsyntaxhighlight lang="parigp">iseven(n)=n%2==0
select(iseven, [2, 3, 4, 5, 7, 8, 9, 11, 13, 16, 17])</langsyntaxhighlight>
 
Or in anonymous form
<langsyntaxhighlight lang="parigp">select(n -> n%2==0, [2, 3, 4, 5, 7, 8, 9, 11, 13, 16, 17])</langsyntaxhighlight>
 
=={{header|Pascal}}==
Line 2,061 ⟶ 2,964:
{{works with|Delphi}}<br>
{{works with|Turbo Pascal}}
<langsyntaxhighlight lang="pascal">const
 
numbers:array[0..9] of integer = (0,1,2,3,4,5,6,7,8,9);
Line 2,069 ⟶ 2,972:
writeln( 'The number ',numbers[x],' is odd.');
else
writeln( 'The number ',numbers[x],' is even.');</langsyntaxhighlight>
 
The odd() function is a standard library function of pascal as is the function even().
Line 2,075 ⟶ 2,978:
=={{header|Peloton}}==
Fixed length English dialect
<langsyntaxhighlight lang="sgml"><@ LETCNWLSTLIT>numbers|1 2 3 4 5 6 7 8 9 10 11 12</@>
<@ DEFLST>evens</@>
<@ ENULSTLIT>numbers|
Line 2,082 ⟶ 2,985:
<@ LETLSTELTLST>evens|...</@>
</@>
</@></langsyntaxhighlight>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">my @a = (1, 2, 3, 4, 5, 6);
my @even = grep { $_%2 == 0 } @a;</langsyntaxhighlight>
 
=={{header|Perl 6}}==
{{works with|Rakudo|2018.03}}
 
<lang perl6>my @a = 1..6;
my @even = grep * %% 2, @a;</lang>
 
Alternatively:
 
<lang perl6>my @a = 1..6;
my @even = @a.grep(* %% 2);</lang>
 
Destructive:
 
<lang perl6>my @a = 1..6;
@a .= grep(* %% 2);</lang>
 
=={{header|Phix}}==
{{libheader|Phix/basics}}
A classic non-destructive solution might look like this:
===basic task===
<lang Phix>function filternd(sequence array, integer filterid)
<!--<syntaxhighlight lang="phix">(phixonline)-->
sequence res = {}
<span style="color: #008080;">function</span> <span style="color: #000000;">even<span style="color: #0000FF;">(<span style="color: #004080;">integer</span> <span style="color: #000000;">i<span style="color: #0000FF;">)</span>
for i=1 to length(array) do
<span style="color: #008080;">return</span> <span style="color: #7060A8;">remainder<span style="color: #0000FF;">(<span style="color: #000000;">i<span style="color: #0000FF;">,<span style="color: #000000;">2<span style="color: #0000FF;">)<span style="color: #0000FF;">=<span style="color: #000000;">0</span>
if call_func(filterid,{array[i]}) then
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
res = append(res,array[i])
<span style="color: #0000FF;">?<span style="color: #7060A8;">filter<span style="color: #0000FF;">(<span style="color: #7060A8;">tagset<span style="color: #0000FF;">(<span style="color: #000000;">10<span style="color: #0000FF;">)<span style="color: #0000FF;">,<span style="color: #000000;">even<span style="color: #0000FF;">)
end if
<!--</syntaxhighlight>-->
end for
{{out}}
return res
<pre>
end function</lang>
{2,4,6,8,10}
</pre>
 
===extra credit===
However, Phix is reference counted so the distinction between destructive and
The following discusses possible destructive/in situ behaviours (in excruciatingly painstaking detail). Phix is reference counted so the distinction between destructive and
non-destructive is more subtle. In the following code filterd() acts both ways.
non-destructive is somewhat subtle. The following code (builtin filter routine) acts both ways.
 
<!--<syntaxhighlight lang="phix">-->
<lang Phix>function filterd(sequence a, integer filterid)
<span style="color: #008080;">function</span> <span style="color: #000000;">even<span style="color: #0000FF;">(<span style="color: #004080;">integer</span> <span style="color: #000000;">i<span style="color: #0000FF;">)</span>
integer l = 0
<span style="color: #008080;">return</span> <span style="color: #7060A8;">remainder<span style="color: #0000FF;">(<span style="color: #000000;">i<span style="color: #0000FF;">,<span style="color: #000000;">2<span style="color: #0000FF;">)<span style="color: #0000FF;">=<span style="color: #000000;">0</span>
for i=1 to length(a) do
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
if call_func(filterid,{a[i]}) then
l += 1
a[l] = a[i]
end if
end for
return a[1..l]
end function
 
function even(integer i)
return and_bits(i,1)=0
end function
constant r_even = routine_id("even")
 
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span>
procedure main()
<span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset<span style="color: #0000FF;">(<span style="color: #000000;">10<span style="color: #0000FF;">)<span style="color: #0000FF;">,</span>
sequence s = tagset(10), t
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter<span style="color: #0000FF;">(<span style="color: #000000;">s<span style="color: #0000FF;">,<span style="color: #000000;">even<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- copy-on-write here...</span>
t = filterd(s,r_even)
<span style="color: #0000FF;">?<span style="color: #000000;">s</span> <span style="color: #000080;font-style:italic;">-- still all 10</span>
?s
<span style="color: #0000FF;">?<span style="color: #000000;">t</span> <span style="color: #000080;font-style:italic;">-- 5</span>
?t
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">filter<span style="color: #0000FF;">(<span style="color: #000000;">s<span style="color: #0000FF;">,<span style="color: #000000;">even<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- ...but automatic pass by reference occurs here</span>
-- automatic pass by reference occurs here for s:
<span style="color: #0000FF;">?<span style="color: #000000;">s</span> <span style="color: #000080;font-style:italic;">-- 5</span>
s = filterd(s,r_even)
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
?s
<span style="color: #000000;">main<span style="color: #0000FF;">(<span style="color: #0000FF;">)
end procedure
<!--</syntaxhighlight>-->
main()</lang>
{{out}}
<pre>
Line 2,151 ⟶ 3,029:
{2,4,6,8,10}
</pre>
It will help to explain what is going on by looking at a couple of longhand (and greatly simplified) versions, first an explicitly non-destructive one
<!--<syntaxhighlight lang="phix">-->
<span style="color: #008080;">function</span> <span style="color: #000000;">lhnd_filter<span style="color: #0000FF;">(<span style="color: #004080;">sequence</span> <span style="color: #000000;">a<span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">fn<span style="color: #0000FF;">)</span>
<span style="color: #004080;">sequence</span> <span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{<span style="color: #0000FF;">}</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i<span style="color: #0000FF;">=<span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length<span style="color: #0000FF;">(<span style="color: #000000;">a<span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">fn<span style="color: #0000FF;">(<span style="color: #000000;">a<span style="color: #0000FF;">[<span style="color: #000000;">i<span style="color: #0000FF;">]<span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">res</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append<span style="color: #0000FF;">(<span style="color: #000000;">res<span style="color: #0000FF;">,<span style="color: #000000;">a<span style="color: #0000FF;">[<span style="color: #000000;">i<span style="color: #0000FF;">]<span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">res</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function
<!--</syntaxhighlight>-->
Clearly the above is non-destructive. It makes no attempt to modify a, but builds a new result, and it is fair to say that in some cases the above may be the fastest approach due to fewer reference count updates. However the following may or may not be destructive:
<!--<syntaxhighlight lang="phix">-->
<span style="color: #008080;">function</span> <span style="color: #000000;">lhd_filter<span style="color: #0000FF;">(<span style="color: #004080;">sequence</span> <span style="color: #000000;">a<span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">fn<span style="color: #0000FF;">)</span>
<span style="color: #004080;">integer</span> <span style="color: #000000;">l</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
<span style="color: #008080;">for</span> <span style="color: #000000;">i<span style="color: #0000FF;">=<span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length<span style="color: #0000FF;">(<span style="color: #000000;">a<span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">fn<span style="color: #0000FF;">(<span style="color: #000000;">a<span style="color: #0000FF;">[<span style="color: #000000;">i<span style="color: #0000FF;">]<span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
<span style="color: #000000;">l</span> <span style="color: #0000FF;">+=</span> <span style="color: #000000;">1</span>
<span style="color: #000000;">a<span style="color: #0000FF;">[<span style="color: #000000;">l<span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a<span style="color: #0000FF;">[<span style="color: #000000;">i<span style="color: #0000FF;">]</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<span style="color: #000000;">a</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">a<span style="color: #0000FF;">[<span style="color: #000000;">1<span style="color: #0000FF;">..<span style="color: #000000;">l<span style="color: #0000FF;">]</span> <span style="color: #000080;font-style:italic;">-- (can occur in situ)</span>
<span style="color: #008080;">return</span> <span style="color: #000000;">a</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
 
<span style="color: #008080;">procedure</span> <span style="color: #000000;">main<span style="color: #0000FF;">(<span style="color: #0000FF;">)</span>
In the t=f(s) call, s is preserved because
<span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">tagset<span style="color: #0000FF;">(<span style="color: #000000;">10<span style="color: #0000FF;">)<span style="color: #0000FF;">,</span>
of copy-on-write semantics. Modifying a does not modify s. In the s=f(s) call,
<span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lhd_filter<span style="color: #0000FF;">(<span style="color: #000000;">s<span style="color: #0000FF;">,<span style="color: #000000;">even<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- copy on write here...</span>
s is automatically passed by reference, ie the local s is <no value> over the
<span style="color: #0000FF;">?<span style="color: #000000;">s</span> <span style="color: #000080;font-style:italic;">-- still all 10</span>
duration of the call whereas parameter a of filterd() contains the only reference to the previous content of s,
<span style="color: #0000FF;">?<span style="color: #000000;">t</span> <span style="color: #000080;font-style:italic;">-- 5</span>
and no copy-on-write occurs. Technically modifying a is still not modifying
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">lhd_filter<span style="color: #0000FF;">(<span style="color: #000000;">s<span style="color: #0000FF;">,<span style="color: #000000;">even<span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- ...but automatic pass by reference occurs here</span>
s, but since it has a reference count of 1 it modifies the data that used to be referenced by s, in situ.
<span style="color: #0000FF;">?<span style="color: #000000;">s</span> <span style="color: #000080;font-style:italic;">-- 5</span>
Note: adding t=s before the s=f(s) call would make it non-destructive again,
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
as t must be preserved and there is now a reference count >1 on that data.
<span style="color: #000000;">main<span style="color: #0000FF;">(<span style="color: #0000FF;">)
<!--</syntaxhighlight>-->
In the t = lhd_filter(s) call, s is preserved because of copy-on-write semantics. Modifying a does not modify s, because it has a reference count of 2 the first attempt to modify it triggers copy-on-write and safely makes a top-level copy. In the s = lhd_filter(s) call however, s is automatically passed by reference, ie the local s is <no value> over the duration of the call and parameter a of lhd_filter() contains the only reference to the previous content of s, and no copy-on-write occurs. Technically modifying a is still not modifying s, but since it has a reference count of 1 it modifies the data that used to be referenced by s, and will again rsn, in situ.
Note: adding t = s before the s = lhd_filter(s) call would make it non-destructive again, as t must be preserved and there is now a reference count >1 on that data. Also note that automatic pass-by-reference only occurs for routine-local variables.
 
There is one case in the interpreter (pEmit2.e/rebuild_callback()) where it needs to circumvent this behaviour. For performance reasons it does not populate the symbol table with actual names until a fatal error or trace event occurs.
At that time, the symbol table may have a reference count>1, so it deliberately patches it to 1 over the name population call to switch off the copy-on-write semantics, and later restores the reference count before carrying on. Not that you really needed to know that.
has to circumvent this behaviour. For performance reasons it does not populate
the symbol table with actual names until a fatal error or trace event occurs.
At that time, the symbol table may have a reference count>1, so it deliberately
patches it to 1 over the name population call to switch off the copy-on-write
semantics, and later restores the reference count before carrying on.
 
=={{header|PHL}}==
 
<langsyntaxhighlight lang="phl">module var;
 
extern printf;
Line 2,178 ⟶ 3,081:
var evens = arr.filter(#(i) i % 2 == 0);
printf("%s\n", evens::str);
 
return 0;
]</langsyntaxhighlight>
 
=={{header|PHP}}==
Using a standard loop
<langsyntaxhighlight lang="php">$arr = range(1,5);
$evens = array();
foreach ($arr as $val){
if ($val % 2 == 0) $evens[] = $val);
}
print_r($evens);</langsyntaxhighlight>
 
Using a filter function
<langsyntaxhighlight lang="php">function is_even($var) { return(!($var & 1)); }
$arr = range(1,5);
$evens = array_filter($arr, "is_even");
print_r($evens);</langsyntaxhighlight>
 
=={{header|Picat}}==
List comprehension is probably the best way of filtering:
<syntaxhighlight lang="picat">[I : I in 1..20, I mod 2 == 0]</syntaxhighlight>
 
A more general version of filtering is to use <code>call/1</code> with a defined predicate (here <code>p/1</code>):
<syntaxhighlight lang="picat">go =>
L = 1..20,
A = filter(L,p).
 
p(N) => N mod 2 == 0.
 
filter(A,F) = [N : N in A, call(F,N)].</syntaxhighlight>
 
This general version might be slower since using <code>call/1</code> has some overhead.
 
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(filter '((N) (not (bit? 1 N)))
(1 2 3 4 5 6 7 8 9) )</langsyntaxhighlight>
{{out}}
<pre>-> (2 4 6 8)</pre>
 
=={{header|PL/I}}==
<langsyntaxhighlight lang="pli">(subscriptrange):
filter_values: procedure options (main); /* 15 November 2013 */
declare a(20) fixed, b(*) fixed controlled;
Line 2,231 ⟶ 3,150:
end filter;
 
end filter_values;</langsyntaxhighlight>
Results:
<pre>
Unfiltered values:
44270 6008 80477 17004 91587 48669 29623 74640 29841 20019 77833 59865 49647 2272 54781
36154 40114 71893 25960 76863
Filtered values:
44270 6008 17004 74640 2272 36154 40114 25960
</pre>
Line 2,244 ⟶ 3,163:
Most natural solution in Pop11 would probably use list. Below we accumulate filtered elements on the stack and then allocate array for the result:
 
<langsyntaxhighlight lang="pop11">;;; Generic filtering procedure which selects from ar elements
;;; satisfying pred
define filter_array(ar, pred);
Line 2,258 ⟶ 3,177:
;;; Use it
filter_array({1, 2, 3, 4, 5},
procedure(x); not(testbit(x, 0)); endprocedure) =></langsyntaxhighlight>
 
=={{header|PostScript}}==
{{libheader|initlib}}
<langsyntaxhighlight lang="postscript">
[1 2 3 4 5 6 7 8 9 10] {2 mod 0 eq} find
</syntaxhighlight>
</lang>
 
=={{header|PowerShell}}==
<langsyntaxhighlight lang="powershell">$array = -15..37
$array | Where-Object { $_ % 2 -eq 0 }</langsyntaxhighlight>
 
=={{header|Prolog}}==
===findall===
<langsyntaxhighlight lang="prolog">evens(D, Es) :- findall(E, (member(E, D), E mod 2 =:= 0), Es).</langsyntaxhighlight>
 
Usage:
 
<langsyntaxhighlight lang="prolog">?- evens([1,2,3,4,5,6,7,8,9,10],E).
E = [2, 4, 6, 8, 10]</langsyntaxhighlight>
 
===Anonymous functions===
Works with SWI-Prolog and <b>module(lambda)</b> written by <b>Ulrich Neumerkel</b>, "lambda.pl" can be found there : http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl
<langsyntaxhighlight Prologlang="prolog">?- use_module(library(lambda)).
true.
 
?- include((\X^(X mod 2 =:= 0)), [1,2,3,4,5,6,7,8,9], L).
L = [2,4,6,8].</langsyntaxhighlight>
 
===filter and anonymous functions===
Works with SWI-Prolog and <b>module(lambda)</b> written by <b>Ulrich Neumerkel</b>, "lambda.pl" can be found there : http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl
<langsyntaxhighlight lang="prolog">:- use_module(lambda).
 
%% filter(Pred, LstIn, LstOut)
Line 2,298 ⟶ 3,217:
filter(Pred, T, L1),
( call(Pred,H) -> L = [H|L1]; L = L1).
</syntaxhighlight>
</lang>
Usage :
<langsyntaxhighlight lang="prolog"> ?- filter(\X^(X mod 2 =:= 0), [1,2,3,4,5,6,7,8,9], L).
L = [2,4,6,8] .
</syntaxhighlight>
</lang>
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Dim Tal.i(9)
Dim Evens.i(0)
 
Line 2,331 ⟶ 3,250:
For i=0 To ArraySize(Evens())
Print(Str(Evens(i))+" ")
Next</langsyntaxhighlight>
 
{{out}}
List of Randoms
32 35 89 91 11 33 12 22 42 43
 
List of Even(s)
32 12 22 42
Line 2,343 ⟶ 3,262:
{{works with|Python|2.4}}
 
<langsyntaxhighlight lang="python">values = range(10)
evens = [x for x in values if not x & 1]
ievens = (x for x in values if not x & 1) # lazy
# alternately but less idiomatic:
evens = filter(lambda x: not x & 1, values)</langsyntaxhighlight>
 
Alternative using the slice syntax with its optional "stride" expression:
 
<langsyntaxhighlight lang="python">values = range(10)
evens = values[::2]</langsyntaxhighlight>
 
This works for all versions of Python (at least as far back as 1.5). Lists (arrays) can be "sliced" by indexing them with a range (lower and upper bounds). Thus mylist[1:9] evaluates into a list from the second item (excluding the first item which is mylist[0], of course) up to but not including the ninth item. In Python the expression mylist[:] is synonymous with mylist[0:len(mylist)] ... returning a copy of the complete list. also mylist[:x] returns the first x items from the list and negative numbers can be used such that mylist[-x:] returns the last x items from the list. The relatively obscure and optional stride expression can skip items and/or force the evaluation from the end of the list downward towards it's lower elements. Thus mylist[::-1] returns a reversed copy of the list, mylist[::2] returns all even elements, mylist[1::2] returns all odd elements, and so on.
Line 2,360 ⟶ 3,279:
One can also assign to a slice (of a list or other mutable indexed object. Thus the following:
 
<langsyntaxhighlight lang="python">values = range(10)
values[::2] = [11,13,15,17,19]
print values
11, 1, 13, 3, 15, 5, 17, 7, 19, 9</langsyntaxhighlight>
 
 
Or in functional terms, by descending generality and increasing brevity:
{{works with|Python|3}}
<langsyntaxhighlight lang="python">'''Functional filtering - by descending generality and increasing brevity'''
 
from functools import (reduce)
Line 2,462 ⟶ 3,381:
 
if __name__ == '__main__':
main()</langsyntaxhighlight>
{{Out}}
<pre>By descending generality and increasing brevity:
Line 2,470 ⟶ 3,389:
(x for x in xs if even(x)) -> [0, 2, 4, 6, 8, 10]
filter(even, xs) -> [0, 2, 4, 6, 8, 10]</pre>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery"> [ [] ]'[ rot
witheach
[ tuck over do iff
[ dip [ nested join ] ]
else nip ]
drop ] is only ( [ --> [ )
 
[ 1 & not ] is even ( n --> b )
 
[] 10 times [ 10 random join ]
say "Ten arbitrary digits: " dup echo cr
say "Only the even digits: " only even echo cr</syntaxhighlight>
 
{{out}}
 
<pre>Ten arbitrary digits: [ 1 6 1 2 2 1 8 5 5 4 ]
Only the even digits: [ 6 2 2 8 4 ]</pre>
 
===Destructively===
 
<syntaxhighlight lang="quackery"> [ ]'[ over size times
[ over i peek
over do if
[ dip [ i pluck drop ] ] ]
drop ] is without ( [ --> [ )
 
[ 1 & ] is odd ( n --> b )
 
[] 10 times [ i join ] shuffle
say "Ten shuffled digits: " dup echo cr
say "Less the odd digits: " without odd echo cr</syntaxhighlight>
 
{{out}}
 
<pre>Ten shuffled digits: [ 5 6 8 2 1 4 0 3 9 7 ]
Less the odd digits: [ 6 8 2 4 0 ]</pre>
 
=={{header|Q}}==
<langsyntaxhighlight lang="q">x where 0=x mod 2</langsyntaxhighlight>
 
=={{header|QBASIC}}==
{{works with|QBasic|1.1}}
{{works with|QuickBasic|4.x}}
{{works with|Visual Basic for DOS|1.0}}
{{works with|PDS|7.x}}
 
===Using two arrays===
This version uses two arrays.
 
<syntaxhighlight lang="qbasic">
' OPTION EXPLICIT
 
' Filter
' This program selects certain elements from an array into a new array in a generic way
 
' Var
' $DYNAMIC
 
TYPE regSub
aNum AS INTEGER
END TYPE
CONST Even = 2
CONST Uneven = 1
CONST cFile = "DUMMY$$$.$$$"
CONST False = 0, True = NOT False
 
DIM t AS INTEGER
DIM t2 AS INTEGER
DIM f AS INTEGER
DIM i AS INTEGER
DIM iFlag AS INTEGER
DIM iGetWhat AS INTEGER
DIM iArray%(1 TO 1)
DIM iArray2%(1 TO 1)
DIM rSub AS regSub
 
' Initialize vars
iFlag = False
f = FREEFILE
iGetWhat = Even
RANDOMIZE TIMER
t = INT(RND * 300) + 1
REDIM iArray%(1 TO t)
 
' Main program cycle
OPEN cFile FOR OUTPUT AS #f
CLOSE
 
OPEN cFile FOR RANDOM AS #f LEN = LEN(rSub)
 
CLS
PRINT "Select items in an array into a new array in a generic way."
PRINT "Base array:"
FOR i = 1 TO t
iArray%(i) = INT(RND * 2000) + 1
PRINT iArray%(i);
IF (iArray%(i) MOD 2) = 0 AND iGetWhat = Even THEN
iFlag = True
ELSEIF (iArray%(i) MOD 2) <> 0 AND iGetWhat = Uneven THEN
iFlag = True
END IF
 
IF iFlag THEN
rSub.aNum = iArray%(i)
PUT #f, , rSub
iFlag = False
END IF
NEXT i
 
' Redims the array
t2 = LOF(f) / LEN(rSub)
REDIM iArray2%(1 TO t2)
 
FOR i = 1 TO t2
GET #f, i, rSub
iArray2%(i) = rSub.aNum
NEXT i
 
CLOSE #f
KILL cFile
 
PRINT
 
' Shows the result
IF t2 > 0 THEN
PRINT "Selected items from the array (total:"; t2; "of"; t; "):"
FOR i = 1 TO t2
PRINT iArray2%(i);
NEXT i
END IF
 
PRINT
PRINT "End of program."
END</syntaxhighlight>
{{out}}
The output can change as the size of the base array and its values varies on each run.
<pre>
Select items in an array into a new array in a generic way.
Base array:
1426 770 1686 1472 385 1212 909 656 776 707 918 1646 1258 1406 887 42
Selected items from the array (total: 12 of 16 ):
1426 770 1686 1472 1212 656 776 918 1646 1258 1406 42
End of program.
</pre>
 
===Using one array===
Extra points: This version uses one array.
<syntaxhighlight lang="qbasic">
' OPTION EXPLICIT
 
' Filter
' This program selects certain elements from an array into a new array in a generic way
' Extra points: Destroys the original values in the array
 
' Var
' $DYNAMIC
 
TYPE regSub
aNum AS INTEGER
END TYPE
CONST Even = 2
CONST Uneven = 1
CONST cFile = "DUMMY$$$.$$$"
CONST False = 0, True = NOT False
DIM t AS INTEGER
DIM t2 AS INTEGER
DIM f AS INTEGER
DIM i AS INTEGER
DIM iFlag AS INTEGER
DIM iGetWhat AS INTEGER
DIM iArray%(1 TO 1)
DIM rSub AS regSub
 
' Initialize vars
iFlag = False
t = INT(RND * 300) + 1
f = FREEFILE
iGetWhat = Even
REDIM iArray%(1 TO t)
 
' Main program cycle
OPEN cFile FOR OUTPUT AS #f
CLOSE
 
OPEN cFile FOR RANDOM AS #f LEN = LEN(rSub)
 
CLS
RANDOMIZE TIMER
PRINT "Select items in an array into a new array in a generic way."
PRINT "Base array:"
FOR i = 1 TO t
iArray%(i) = INT(RND * 2000) + 1
PRINT iArray%(i);
IF (iArray%(i) MOD 2) = 0 AND iGetWhat = Even THEN
iFlag = True
ELSEIF (iArray%(i) MOD 2) <> 0 AND iGetWhat = Uneven THEN
iFlag = True
END IF
 
IF iFlag THEN
rSub.aNum = iArray%(i)
PUT #f, , rSub
iFlag = False
END IF
NEXT i
 
' Redims the array
t = LOF(f) / LEN(rSub)
REDIM iArray%(1 TO t)
 
FOR i = 1 TO t
GET #f, i, rSub
iArray%(i) = rSub.aNum
NEXT i
 
CLOSE #f
KILL cFile
 
PRINT
 
' Shows the result
t2 = UBOUND(iArray%)
IF t2 > 0 THEN
PRINT "Selected items from the array (total:"; t2; "of"; t; "):"
FOR i = 1 TO t2
PRINT iArray%(i);
NEXT i
END IF
 
PRINT
PRINT "End of program."
END
</syntaxhighlight>
{{out}}
The output can change as the size of the base array and its values varies on each run.
<pre>
Select items in an array into a new array in a generic way.
Base array:
1426 770 1686 1472 385 1212 909 656 776 707 918 1646 1258 1406 887 42
Selected items from the array (total: 12 of 16 ):
1426 770 1686 1472 1212 656 776 918 1646 1258 1406 42
End of program.
</pre>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">a <- 1:100
evennums <- a[ a%%2 == 0 ]
print(evennums)</langsyntaxhighlight>
 
=={{header|Racket}}==
The classic way:
<syntaxhighlight lang="racket">
<lang Racket>
-> (filter even? '(0 1 2 3 4 5 6 7 8 9))
'(0 2 4 6 8)
</syntaxhighlight>
</lang>
getting the list of non-evens too:
<syntaxhighlight lang="racket">
<lang Racket>
-> (partition even? '(0 1 2 3 4 5 6 7 8 9))
'(0 2 4 6 8)
'(1 3 5 7 9)
</syntaxhighlight>
</lang>
Finally, using a for loop, similar to list comprehension:
<syntaxhighlight lang="racket">
<lang Racket>
-> (for/list ([x '(0 1 2 3 4 5 6 7 8 9)] #:when (even? x)) x)
'(0 2 4 6 8)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.03}}
 
<syntaxhighlight lang="raku" line>my @a = 1..6;
my @even = grep * %% 2, @a;</syntaxhighlight>
 
Alternatively:
 
<syntaxhighlight lang="raku" line>my @a = 1..6;
my @even = @a.grep(* %% 2);</syntaxhighlight>
 
Destructive:
 
<syntaxhighlight lang="raku" line>my @a = 1..6;
@a .= grep(* %% 2);</syntaxhighlight>
 
=={{header|Raven}}==
<langsyntaxhighlight lang="raven">[ 0 1 2 3 4 5 6 7 8 9 ] as nums
group nums each
dup 1 & if drop
list as evens</langsyntaxhighlight>
 
=={{header|REBOL}}==
<langsyntaxhighlight REBOLlang="rebol">a: [] repeat i 100 [append a i] ; Build and load array.
 
evens: [] repeat element a [if even? element [append evens element]]
 
print mold evens</langsyntaxhighlight>
 
{{out}}
<pre>[2 4 6 8 10 12 14 16 18 20 22 24
26 28 30 32 34 36 38 40 42 44 46 48 50
52 54 56 58 60 62 64 66 68 70 72 74 76
78 80 82 84 86 88 90 92 94 96 98 100]</pre>
 
=={{header|Red}}==
<langsyntaxhighlight Redlang="red">Red []
orig: [] repeat i 10 [append orig i]
?? orig
Line 2,525 ⟶ 3,705:
remove-each ele orig [odd? ele] ;; destructive
?? orig
</syntaxhighlight>
</lang>
{{out}}
<pre>orig: [1 2 3 4 5 6 7 8 9 10]
cpy: [2 4 6 8 10]
orig: [2 4 6 8 10]
>>
</pre>
 
=={{header|REXX}}==
===using two arrays===
This example uses two arrays. &nbsp; The &nbsp; '''random''' &nbsp; BIF is used to generate the numbers.
<langsyntaxhighlight lang="rexx">/*REXX program selects all even numbers from an array and puts them ──► a new array.*/
parse/* arginto Na seednew array. /*obtain optional arguments from the CL */
ifParse N==''Arg |n N=="," then N=50seed . /*Not specified?obtain optional Thenarguments usefrom the default.CL*/
ifIf datatype(seed,n=='W')|n=="," Then n=50 then call random ,,seed /* Not specified? use the RANDOM seeddefault for repeatability*/
If datatype(seed,'W') Then
old.= /*the OLD array, all are null so far. */
new.= Call random,,seed /* " NEW " " " " " use "RANDOM seed for repeatability*/
doDo i=1 For forn N /* generate N random numbers ──► OLD */
old.i=random(1,99999) /* generate random number 1 ──► 99999 */
End
end /*i*/
#m=0 /* number of elements in NEW NEW (so far).*/
doDo j=1 To for N n /* process the elements of the OLD array */
ifIf old.j//2 \== 0 Then then iterate Do /* if element isn'tis even, then skip it. */
#m=#m+1 /* bump the number of NEW elements.elemens */
new.#m=old.j /* assign the number to the NEW array. */
end /*j*/End
End
 
doDo k=1 For for # m /* display all the NEW numbers. */
saySay right('new.'k, 20) "'="' right(new.k,9) /*display a line (an array element). */
End </syntaxhighlight>
end /*k*/ /*stick a fork in it, we're all done. */</lang>
{{out|output|text=&nbsp; when using the input of: &nbsp; &nbsp; <tt> , &nbsp; 12345 </tt>}}
Programming note: &nbsp; the REXX statement
The '''12345''' is the '''random''' BIF &nbsp; ''seed'' &nbsp; so that the random numbers can be repeated when re-running the REXX program.
<lang rexx> if old.j//2 \== 0 then iterate</lang>
could've been replaced with
<lang rexx> if old.j//2 then iterate</lang>
but that would've assumed the numbers are integers &nbsp; (no matter what form they're expressed in).<br>
As it happens, the REXX program uses the numbers generated from the &nbsp; '''random''' &nbsp; BIF, which are integers.
 
'''output''' &nbsp; when the following is used for input: &nbsp; <tt> , &nbsp; 1234567 </tt>
 
The '''1234567''' is the '''random''' BIF &nbsp; ''seed'' &nbsp; so that the random numbers can be repeated when re-running the REXX program.
<pre>
new.1 = 17520
Line 2,589 ⟶ 3,762:
new.23 = 44360
</pre>
===Using a control array===
 
===usingThis oneversion array withuses a control array=== (even.*)
<syntaxhighlight lang="rexx">
This version uses a control array, which isn't fully populated &nbsp; (in REXX terms, a sparse array.)
<lang rexx>/*REXX program findsuses alla even numbers from ancontrol array, to andtell which markselements aars control arrayeven. */
parseParse argArg Nn seed . /* obtain optional arguments from the CL*/
ifIf Nn=='' | Nn=="," Then then Nn=50 /* Not specified? Then use the default. */
ifIf datatype(seed,'W') then call random ,,seed /*use the RANDOM seed for repeatability*/Then
Call random,,seed /* use RANDOM seed for repeatability*/
 
doDo i=1 For forn N /* generate n random numbers N random numbers ──► OLD */
@x.i=random(1,99999) /* generate random number 1 ──► 99999 */
End
end /*i*/
!even.=0 /* all even bits are off /*number of elements in NEW (so far).*/
doDo j=1 To for N n /* process the elements OLDof x.* array elements. */
If if @x.j//2 \==0 Then then !.j=1 /* if element is /*markeven, thethen ! array that it's ¬even. */
even.j=1 /* turn on the even bit */
end /*j*/
End
 
doDo k=1 To for N n /* display all the numbers @ even numbers. */
If even.k Then if !.k then iterate /* that are even /*if it's marked as not even, skip it.*/
saySay right('arrayx.'k, 20) "'="' right(@x.k,9) /*display a even number, filtered array*/
End</syntaxhighlight>
end /*k*/ /*stick a fork in it, we're all done. */</lang>
For{{out|output|text=&nbsp; thewhen followingusing the input of: &nbsp; &nbsp; <tt> ,20 1234567&nbsp; 12345 </tt> <br>}}
<pre>
the output is the same as the 1<sup>st</sup> REXX version &nbsp; (using two arrays).
x.3 = 52754
 
x.5 = 94296
x.6 = 2068
x.13 = 71494
x.14 = 71628
x.15 = 47404
x.19 = 92502
x.20 = 24808</pre>
===using one array, destructive===
This version just uses one array to perform the filtering instead of creating a &nbsp; ''new'' &nbsp; array.
The result is a sparse array.
 
This method doesn't need as much memory to hold the sparse array.
<langsyntaxhighlight lang="rexx">/*REXX program findssets all elements evencontaining odd numbers fromto anblank array, and marks the not even numbers.*/
parseParse argArg Nn seed . /* obtain optional arguments from the CL*/
ifIf Nn=='' | Nn=="," Then then Nn=50 /* Not specified? Then use the default. */
ifIf datatype(seed,'W') then call random ,,seed /*use the RANDOM seed for repeatability*/Then
Call random,,seed /* use RANDOM seed for repeatability*/
 
doDo i=1 For forn N /* generate N random numbers ──► OLD */
@x.i=random(1,99999) /* generate a random number 1 ──► 99999 */
End
end /*i*/
Do j=1 To n /* process the elements of x.* */
 
If do x.j=1 for N //2<>0 Then /*process theif element OLDis not arrayeven, then elements. */
Drop if @x.j//2 \==0 then @.j= /*mark thedelete it @ array that it's not even*/
End
end /*j*/
Do k=1 To n /* display all the numbers */
 
If do datatype(x.k)=1'NUM' Then for N /* that are even /*display all the @ even numbers. */
Say right('x.'k,20) '=' right(x.k,9)
if @.k=='' then iterate /*if it's marked not even, then skip it*/
End</syntaxhighlight>
say right('array.'k, 20) "=" right(@.k,9) /*display a line (an array element). */
For the following input: &nbsp; &nbsp; <tt> 20 12345 </tt>
end /*k*/ /*stick a fork in it, we're all done. */</lang>
'''{{out|output''' |text=&nbsp; whenis the followingsame isas used for input: &nbsp;the 2<ttsup>nd</sup> ,REXX &nbsp; 1234567version.}} </ttbr> <br>
Output is the same as the 1<sup>st</sup> REXX version &nbsp; (using two arrays). <br><br>
 
=={{header|Ring}}==
<syntaxhighlight lang="text">
aList = [1, 2, 3, 4, 5, 6]
bArray = list(3)
Line 2,643 ⟶ 3,822:
 
func evenSelect aArray
i = 0
for n = 1 to len(aArray)
if (aArray[n] % 2) = 0
i = i + 1
Line 2,650 ⟶ 3,829:
next
return bArray
</syntaxhighlight>
</lang>
 
=={{header|RPL}}==
{{works with|Halcyon Calc|4.2.7}}
{| class="wikitable"
! RPL code
! Comment
|-
|
DUP SIZE {} 2 ROT '''FOR''' j OVER j GET + 2 '''STEP'''
≫ ''''FILTR'''' STO
LIST→ → len
≪ {} len 1 '''FOR''' j
'''IF''' j 2 MOD '''THEN''' SWAP DROP '''ELSE''' + '''END'''
-1 '''STEP'''
≫ ≫ ''''FILTD'''' STO
|
'''FILTR''' ''( { a1 a2.. an } -- { a1 a2.. an } { a2 a4... a2k } )''
selective copy
'''FILTD''' ''( { a1 a2.. an } -- { a2 a4... a2k } )''
Destructive version : put the array in the stack...
... and make a new one by picking one out of two items
|}
{{in}}
<pre>
{ 1 2 3 4 5 6 7 8 9 } FILTR
{ 1 2 3 4 5 6 7 8 9 } FILTD
</pre>
{{out}}
<pre>
3: { 1 2 3 4 5 6 7 8 9 }
2: { 2 4 6 8 }
1: { 2 4 6 8 }
</pre>
 
=={{header|Ruby}}==
Enumerable#select is the filter that returns a new Array.
 
<langsyntaxhighlight lang="ruby"># Enumerable#select returns a new array.
ary = [1, 2, 3, 4, 5, 6]
even_ary = ary.select {|elem| elem.even?}
Line 2,663 ⟶ 3,883:
range = 1..6
even_ary = range.select {|elem| elem.even?}
p even_ary # => [2, 4, 6]</langsyntaxhighlight>
 
=== Destructive ===
Array#select! is the destructive version which modifies the original Array.
 
<langsyntaxhighlight lang="ruby">ary = [1, 2, 3, 4, 5, 6]
ary.select! {|elem| elem.even?}
p ary # => [2, 4, 6]</langsyntaxhighlight>
 
Shorthand:
 
<syntaxhighlight lang="ruby">ary = [1, 2, 3, 4, 5, 6]
ary.select!(&:even?)
p ary # => [2, 4, 6]</syntaxhighlight>
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">dim a1(100)
count = 100
for i = 1 to 100
Line 2,679 ⟶ 3,905:
count = count - (a1(i) mod 2)
next
 
'dim the extract and fill it
dim a2(count)
Line 2,688 ⟶ 3,914:
end if
next
 
for i = 1 to count
print a2(i)
next</langsyntaxhighlight>
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">fn main() {
println!("new vec filtered: ");
let nums: Vec<i32> = (1..20).collect();
Line 2,705 ⟶ 3,931:
nums.retain(|x| x % 2 == 0);
println!("{:?}", nums);
}</langsyntaxhighlight>
 
{{out}}
Line 2,718 ⟶ 3,944:
In this example, [1...10] is a list of the integers from 1 to 10. The comprehend expression walks over this list and selects only the even elements. The result of the comprehend expression is a new list with only the even elements. Then an iterate statement is used to walk over the list of even elements and print them out.
 
<langsyntaxhighlight Salmonlang="salmon">iterate(x; comprehend(y; [1...10]; y % 2 == 0) (y))
x!;</langsyntaxhighlight>
 
Here's a version that walks an array destructively removing the non-even elements:
 
<langsyntaxhighlight Salmonlang="salmon">variable my_array := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
variable write_position := 0;
iterate (read_position; [0...9])
Line 2,737 ⟶ 3,963:
my_array := my_array[0...write_position - 1];
iterate(x; my_array)
x!;</langsyntaxhighlight>
 
=={{header|Sather}}==
<langsyntaxhighlight lang="sather">class MARRAY{T} < $ARR{T} is
include ARRAY{T};
 
Line 2,762 ⟶ 3,988:
#OUT + "\n";
end;
end;</langsyntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">(1 to 100).filter(_ % 2 == 0)</langsyntaxhighlight>
 
=={{header|Scheme}}==
Filter function definition:
In the interactive prompt:
<syntaxhighlight lang="scheme">
<lang scheme>> (filter even? '(1 2 3 4 5 6 7 8 9 10))
(define filter
(2 4 6 8 10)</lang>
(lambda (fn lst)
(let iter ((lst lst) (result '()))
(if (null? lst)
(reverse result)
(let ((item (car lst))
(rest (cdr lst)))
(if (fn item)
(iter rest (cons item result))
(iter rest result)))))))
</syntaxhighlight>
Usage in the interactive prompt:
<syntaxhighlight lang="scheme">> (filter even? '(1 2 3 4 5 6 7 8 9 10))
(2 4 6 8 10)</syntaxhighlight>
Or as a function:
<langsyntaxhighlight lang="scheme">(define (select-even lst)
(filter even? lst))
 
(select-even '(1 2 3 4 5 6 7 8 9 10))</langsyntaxhighlight>
 
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">var array integer: arr is [] (1, 2, 3, 4, 5);
var array integer: evens is 0 times 0;
var integer: number is 0;
Line 2,787 ⟶ 4,025:
evens &:= [] (number);
end if;
end for;</langsyntaxhighlight>
 
=={{header|Sidef}}==
<lang ruby>var arr = [1,2,3,4,5];
 
# Creates a new array
var new = arr.grep {|i| i %% 2};
say new.dump; # => [2, 4]
 
# Destructive (at variable level)
arr.grep! {|i| i %% 2};
say arr.dump; # => [2, 4]</lang>
 
=={{header|SequenceL}}==
Filters are primarily written in SequenceL using partial Indexed Functions.<br>
<langsyntaxhighlight lang="sequencel">evens(x(1))[i] := x[i] when x[i] mod 2 = 0;</langsyntaxhighlight>
 
{{out}}
Line 2,809 ⟶ 4,036:
[2,4]
</pre>
 
=={{header|Sidef}}==
<syntaxhighlight lang="ruby">var arr = [1,2,3,4,5]
 
# Creates a new array
var new = arr.grep {|i| i.is_even }
say new # => [2, 4]
 
# Destructive (at variable level)
arr.grep! {|i| i.is_even }
say arr # => [2, 4]</syntaxhighlight>
 
=={{header|Slate}}==
<langsyntaxhighlight lang="slate">#(1 2 3 4 5) select: [| :number | number isEven].</langsyntaxhighlight>
 
=={{header|Slope}}==
<syntaxhighlight lang="slope">
(define number-list (range 20))
 
(define even-number-list
(filter
(lambda (num) (equal? (% num 2) 0))
number-list))
 
(display number-list "\n" even-number-list "\n")
</syntaxhighlight>
 
'''Output:'''
<syntaxhighlight lang="text">
(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19)
(0 2 4 6 8 10 12 14 16 18)
</syntaxhighlight>
 
=={{header|Smalltalk}}==
Creates a new array:
<lang smalltalk>#(1 2 3 4 5) select: [:number | number even]</lang>
<syntaxhighlight lang="smalltalk">#(1 2 3 4 5) select: [:number | number even]</syntaxhighlight>
or for short:
<syntaxhighlight lang="smalltalk">#(1 2 3 4 5) select:#even</syntaxhighlight>
Destructive modification is not possible for literal constants (these are immutable);
in addition, Arrays are fix sized collections. It is also considered very bad style, to modify passed in arguments this way. Thus constructing a new Array object (as above) is the only correct solution.
 
=={{header|SQL}}==
Task: Select certain elements from an Array into a new Array in a generic way. To demonstrate, select all even numbers from an Array.
 
{{works with|MS SQL}}
<langsyntaxhighlight lang="sql">--Create the original array (table #nos) with numbers from 1 to 10
create table #nos (v int)
declare @n int set @n=1
Line 2,833 ⟶ 4,094:
-- Clean up so you can edit and repeat:
drop table #nos
drop table #evens</langsyntaxhighlight>
 
'{{works with|MySQL}}
<langsyntaxhighlight lang="sql">create temporary table nos (v int);
insert into nos values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
create temporary table evens (v int);
Line 2,842 ⟶ 4,103:
select * from evens order by v; /*2,4,6,8,10*/
drop table nos;
drop table evens;</langsyntaxhighlight>
 
Or to be shorter, you could create the table evens directly from the query result :
<langsyntaxhighlight lang="sql">create temporary table evens select * from nos where v%2=0;</langsyntaxhighlight>
 
=={{header|Stata}}==
<langsyntaxhighlight lang="stata">mata
a=2,9,4,7,5,3,6,1,8
 
Line 2,856 ⟶ 4,117:
// Select the indices of even elements of a
selectindex(mod(a,2):==0)
end</langsyntaxhighlight>
=={{header|Tcl}}==
Tcl doesn't really have a concept of a "number" per se - strictly speaking its only data type is the string (but a string can be interpreted as a number, of course). The generic way of getting certain elements from an array looks roughly like this:
 
<lang tcl>foreach key [array names arr] {if { <condition> } then {puts $arr($key)}}</lang>
 
In this case, we can do this particular challenge with:
<lang tcl>foreach {key val} [array get srcArray] {
if {[string is integer -strict $key] && !($key%2)} {
set dstArray($key) $val
}
}</lang>
 
If we were using Tcl's lists and interpreting the challenge to mean getting just the elements at index 0, 2, 4, ...
<lang tcl>foreach {even odd} $srcList {
lappend dstList $even
}</lang>
 
=={{header|Swift}}==
<langsyntaxhighlight lang="swift">let numbers = [1,2,3,4,5,6]
let even_numbers = numbers.filter { $0 % 2 == 0 }
println(even_numbers)</langsyntaxhighlight>
{{out}}
<pre>
[2, 4, 6]
</pre>
 
=={{header|Tcl}}==
<syntaxhighlight lang="tcl">set l {56 21 71 27 39 62 87 76 82 94 45 83 65 45 28 90 52 44 1 89}
 
puts [lmap x $l {if {$x % 2} continue; set x}]</syntaxhighlight>
{{out}}
<pre>56 62 76 82 94 28 90 52 44</pre>
<br>
Inplace way, quite the inefficient contraption compared to mapping:
<syntaxhighlight lang="tcl">proc lreplaceip {_list args} {
upvar 1 $_list list
set list [lreplace $list[set list {}] {*}$args]
}
 
set l {56 21 71 27 39 62 87 76 82 94 45 83 65 45 28 90 52 44 1 89}
 
for {set i 0} {$i < [llength $l]} {} {
if {[lindex $l $i] % 2 == 1} {
lreplaceip l $i $i
} else {
incr i
}
}
 
puts $l</syntaxhighlight>
{{out}}
<pre>56 62 76 82 94 28 90 52 44</pre>
Explanation: https://wiki.tcl-lang.org/page/lreplace, section "Performance: Modifying a List In-Place"<br>
Proof by timing removal of the end element of lists of different lengths:
<syntaxhighlight lang="tcl">proc lreplaceip {_list args} {
upvar 1 $_list list
set list [lreplace $list[set list {}] {*}$args]
}
 
proc iota {n {start 0}} {
set res {}
set end [expr {$start + $n}]
for {set i $start} {$i <= $end} {incr i} {
lappend res $i
}
return $res
}
 
foreach e {5 6 7} {
set l [iota 1e$e]
puts 1e$e
puts " lreplace: [time {set l [lreplace $l end end]}]"
puts " lreplaceip: [time {lreplaceip l end end}]"
}</syntaxhighlight>
{{out}}
<pre>1e5
lreplace: 564 microseconds per iteration
lreplaceip: 19 microseconds per iteration
1e6
lreplace: 15215 microseconds per iteration
lreplaceip: 6 microseconds per iteration
1e7
lreplace: 148028 microseconds per iteration
lreplaceip: 6 microseconds per iteration</pre>
 
=={{header|Toka}}==
<langsyntaxhighlight lang="toka">10 cells is-array table
10 cells is-array even
{
Line 2,890 ⟶ 4,194:
[ swap source ! >r reset r> 0
[ i source @ array.get
dup 2 mod 0 <> [ drop ] ifTrue
] countedLoop
depth 0 swap [ i even array.put ] countedLoop
Line 2,896 ⟶ 4,200:
} is copy-even
10 0 [ i i table array.put ] countedLoop
table 10 copy-even</langsyntaxhighlight>
 
=={{header|TUSCRIPT}}==
<langsyntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
arr="1'4'9'16'25'36'49'64'81'100",even=""
Line 2,907 ⟶ 4,211:
ENDLOOP
PRINT even
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,916 ⟶ 4,220:
{{works with|Bash}}
 
<langsyntaxhighlight lang="bash">a=(1 2 3 4 5)
unset e[@]
for ((i=0;i<${#a[@]};i++)); do
[ $((a[$i]%2)) -eq 0 ] && e[$i]="${a[$i]}"
done</langsyntaxhighlight>
 
Or, using '''grep''':
 
<langsyntaxhighlight lang="bash">a=(1 2 3 4 5)
read -a e -d\n < <(printf '%s\n' "${a[@]}" | grep '[02468]$')</langsyntaxhighlight>
 
Either way, to display the results:
 
<langsyntaxhighlight lang="bash">echo "${a[@]}"
echo "${e[@]}"</langsyntaxhighlight>
 
{{out}}
Line 2,937 ⟶ 4,241:
 
=={{header|UnixPipes}}==
<langsyntaxhighlight lang="bash">yes \ | cat -n | while read a; do ; expr $a % 2 >/dev/null && echo $a ; done</langsyntaxhighlight>
 
=={{header|Ursala}}==
 
Ursala doesn't have arrays, except when the run time system
transparently converts a list to an array
as needed for an external math library function call.
However, selection can be done on lists.
 
Line 2,951 ⟶ 4,255:
predicate <code>p</code> is to write <code>p*~</code>, as shown below.
 
<langsyntaxhighlight Ursalalang="ursala">#import std
#import nat
 
Line 2,958 ⟶ 4,262:
#cast %nL
 
y = (not remainder\2)*~ x</langsyntaxhighlight>
 
{{out}}
Line 2,970 ⟶ 4,274:
of other ways to do it.
Selecting according to a binary predicate can be done like this.
<langsyntaxhighlight Ursalalang="ursala">z = (not remainder)~| (36,<1,2,3,4,5,6,7,8,9,10,11,12>)</langsyntaxhighlight>
The value of <code>z</code> will be the divisors of 36 appearing in the list.
<pre>
Line 2,987 ⟶ 4,291:
modified by appending an <code>F</code>, it becomes a selection filter.
For example
<langsyntaxhighlight Ursalalang="ursala">shortcut = ~&ihBF x</langsyntaxhighlight>
using the <code>x</code> defined above will evaluate to
<pre>
Line 2,995 ⟶ 4,299:
 
=={{header|V}}==
<langsyntaxhighlight lang="v">[even? dup 2 / >int 2 * - zero?].
 
[1 2 3 4 5 6 7 8 9] [even?] filter
=[2 4 6 8]</langsyntaxhighlight>
 
=={{header|VBA}}==
<syntaxhighlight lang="vb">
<lang vb>
Option Explicit
 
Line 3,007 ⟶ 4,311:
Dim evens() As Long, i As Long
Dim numbers() As Long
 
For i = 1 To 100000
ReDim Preserve numbers(1 To i)
numbers(i) = i
Next i
 
evens = FilterInNewArray(numbers)
 
Debug.Print "Count of initial array : " & UBound(numbers) & ", first item : " & numbers(LBound(numbers)) & ", last item : " & numbers(UBound(numbers))
Debug.Print "Count of new array : " & UBound(evens) & ", first item : " & evens(LBound(evens)) & ", last item : " & evens(UBound(evens))
 
FilterInPlace numbers
 
Debug.Print "Count of initial array (filtered): " & UBound(numbers) & ", first item : " & numbers(LBound(numbers)) & ", last item : " & numbers(UBound(numbers))
End Sub
Line 3,048 ⟶ 4,352:
Private Function IsEven(Number As Long) As Boolean
IsEven = (CLng(Right(CStr(Number), 1)) And 1) = 0
End Function</langsyntaxhighlight>
 
{{Out}}
Line 3,054 ⟶ 4,358:
Count of new array : 50000, first item : 2, last item : 100000
Count of initial array (filtered): 50000, first item : 2, last item : 100000</pre>
 
 
=={{header|VBScript}}==
<syntaxhighlight lang="vb">
<lang vb>
test_arr_1 = Array(1,2,3,4,5,6,7,8,9,10)
test_arr_2 = Array(1,2,3,4,5,6,7,8,9,10)
Line 3,104 ⟶ 4,407:
ReDim Preserve arr(UBound(arr)-count)
filter_destruct = Join(arr,",")
End Function</langsyntaxhighlight>
 
{{Out}}
Line 3,119 ⟶ 4,422:
=={{header|Visual Basic .NET}}==
{{works with|Visual Basic .NET|9.0+}}
<langsyntaxhighlight lang="vbnet">Module Filter
 
Sub Main()
Line 3,160 ⟶ 4,463:
 
End Module
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,187 ⟶ 4,490:
8
10
</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">
fn reduce(mut a []int){
mut last := 0
for e in a {
if e % 2 == 0 {
a[last] = e
last++
}
}
a = a[..last].clone()
}
fn main() {
mut nums := [5, 4, 8, 2, 4, 6, 5, 6, 34, 12, 21]
even := nums.filter(it % 2 == 0)
println('orig: ${nums}')
println('even: ${even}')
reduce(mut nums)
println('dest: ${nums}')
}
</syntaxhighlight>
{{out}}
<pre>
orig: [5, 4, 8, 2, 4, 6, 5, 6, 34, 12, 21]
even: [4, 8, 2, 4, 6, 6, 34, 12]
dest: [4, 8, 2, 4, 6, 6, 34, 12]
</pre>
 
=={{header|WDTE}}==
<langsyntaxhighlight WDTElang="wdte">let a => import 'arrays';
let s => import 'stream';
 
Line 3,197 ⟶ 4,528:
-> s.collect
-- io.writeln io.stdout
;</langsyntaxhighlight>
 
{{out}}
Line 3,205 ⟶ 4,536:
 
=={{header|Wrapl}}==
<langsyntaxhighlight lang="wrapl">VAR a <- ALL 1:to(10);</langsyntaxhighlight>
<tt>a</tt> will be the list <tt>[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]</tt>
<langsyntaxhighlight lang="wrapl">VAR e <- ALL a:values \ $ % 2 = 0;</langsyntaxhighlight>
<tt>e</tt> will be the list <tt>[2, 4, 6, 8, 10]</tt>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">var a = [1, 4, 17, 8, -21, 6, -11, -2, 18, 31]
System.print("The original array is : %(a)")
 
System.print("\nFiltering to a new array :-")
var evens = a.where { |e| e%2 == 0 }.toList
System.print("The even numbers are : %(evens)")
System.print("The original array is still : %(a)")
 
// Destructive filter, permanently remove even numbers.
evens.clear()
for (i in a.count-1..0) {
if (a[i]%2 == 0) {
evens.add(a[i])
a.removeAt(i)
}
}
evens = evens[-1..0]
System.print("\nAfter a destructive filter :-")
System.print("The even numbers are : %(evens)")
System.print("The original array is now : %(a)")</syntaxhighlight>
 
{{out}}
<pre>
The original array is : [1, 4, 17, 8, -21, 6, -11, -2, 18, 31]
 
Filtering to a new array :-
The even numbers are : [4, 8, 6, -2, 18]
The original array is still : [1, 4, 17, 8, -21, 6, -11, -2, 18, 31]
 
After a destructive filter :-
The even numbers are : [4, 8, 6, -2, 18]
The original array is now : [1, 17, -21, -11, 31]
</pre>
 
=={{header|XPL0}}==
Line 3,214 ⟶ 4,580:
There is no 'sizeof' operator, unfortunately.
 
<langsyntaxhighlight XPL0lang="xpl0">include c:\cxpl\codes; \intrinsic 'code' declarations
 
proc Filter(A, B, Option); \Select all even numbers from array A
Line 3,241 ⟶ 4,607:
[IntOut(0, Array(I)); ChOut(0, ^ )];
CrLf(0);
]</langsyntaxhighlight>
 
{{out}}
<pre>
4 2 6 4
4 2 6 4
</pre>
 
=={{header|XQuery}}==
<langsyntaxhighlight lang="xquery">
(: Sequence of numbers from 1 to 10 :)
let $array := (1 to 10)
Line 3,268 ⟶ 4,634:
<long>{$long}</long>
</result>
</syntaxhighlight>
</lang>
 
{{out}}
<langsyntaxhighlight lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<result>
Line 3,277 ⟶ 4,643:
<long>2 4 6 8 10</long>
</result>
</syntaxhighlight>
</lang>
 
=={{header|XSLT}}==
<langsyntaxhighlight lang="xml"><xsl:for-each select="nodes[@value mod 2 = 0]">
<xsl:value-of select="@value" />
</xsl:for-each></langsyntaxhighlight>
 
=={{header|Z80 Assembly}}==
{{untested}}
<syntaxhighlight lang="z80">TestArray_Metadata:
byte 4,4 ;4 rows, 4 columns.
TestArray:
byte 0,1,2,3
byte 4,5,6,7
byte 8,9,10,11
byte 12,13,14,15
 
OutputArray_Metadata:
byte 2,4
OutputArray:
ds 8,0 ;16 bytes each equaling zero
 
FilterEvenValues:
ld hl,TestArray_Metadata
ld a,(hl)
inc hl
ld b,(hl)
inc hl ;LD HL,TestArray
call mul_A_times_B ;unimplemented multiplication routine, multiplies A by B and returns product in A.
ld b,a ;we'll use this product as a loop counter.
 
ld de,OutputArray
 
loop_filterEvenValues:
ld a,(hl)
ld c,a
rrc c ;destructively test if odd or even. (That's why it was copied into C first.)
jr c,skipThis
ld (de),a
inc de
 
skipThis:
inc hl
djnz loop_filterEvenValues
 
ret ;return to basic</syntaxhighlight>
 
{{out}}
There was no code showing the contents of OutputArray to the screen, so here's a hexdump instead:
<pre>
00 02 04 06 08 0A 0C 0E
</pre>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">T(1,4,9,16,25,36,"37",49,64,81,100, True,self)
.filter(fcn(n){(0).isType(n) and n.isOdd})
//-->L(1,9,25,49,81)</langsyntaxhighlight>
 
=={{header|ZX Spectrum Basic}}==
<langsyntaxhighlight lang="zxbasic">10 LET items=100: LET filtered=0
20 DIM a(items)
30 FOR i=1 TO items
Line 3,303 ⟶ 4,715:
120 NEXT i
130 DIM a(1): REM To free memory (well, almost all)
140 DEF FN m(a,b)=a-INT (a/b)*b</langsyntaxhighlight>
890

edits