Closures/Value capture: Difference between revisions

m
syntax highlighting fixup automation
m (syntax highlighting fixup automation)
Line 17:
 
=={{header|11l}}==
<langsyntaxhighlight lang="11l">[(() -> Int)] funcs
L(i) 10
funcs.append(() -> @=i * @=i)
print(funcs[3]())</langsyntaxhighlight>
 
{{out}}
Line 31:
One way to realize closures in Ada is the usage of protected objects.
 
<langsyntaxhighlight lang="Ada">with Ada.Text_IO;
 
procedure Value_Capture is
Line 60:
Ada.Text_IO.Put(Integer'Image(A(I).Result));
end loop;
end Value_Capture;</langsyntaxhighlight>
 
{{out}}
Line 68:
{{works with|ALGOL 68G|2.8}}
 
<langsyntaxhighlight lang="algol68">
[1:10]PROC(BOOL)INT squares;
 
Line 81:
FOR i FROM 1 TO 10 DO print(squares[i](FALSE)) OD
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 91:
 
=={{header|AntLang}}==
<langsyntaxhighlight lang="AntLang">fns: {n: x; {n expt 2}} map range[10]
(8 elem fns)[]</langsyntaxhighlight>
 
=={{header|AppleScript}}==
{{trans|JavaScript}}
<langsyntaxhighlight lang="AppleScript">on run
set fns to {}
Line 112:
end |λ|
end script
end closure</langsyntaxhighlight>
{{Out}}
<pre>9</pre>
Line 118:
Or, in a more functional pattern of composition:
 
<langsyntaxhighlight lang="AppleScript">-- CLOSURE --------------------------------------------------------------------
 
script closure
Line 171:
end script
end if
end mReturn</langsyntaxhighlight>
{{Out}}
<pre>9</pre>
Line 177:
=={{header|Axiom}}==
Using the Spad compiler:
<langsyntaxhighlight lang="Axiom">)abbrev package TESTP TestPackage
TestPackage() : with
test: () -> List((()->Integer))
== add
test() == [(() +-> i^2) for i in 1..10]</langsyntaxhighlight>
 
This can be called from the interpreter using:
<langsyntaxhighlight lang="Axiom">[x() for x in test()]</langsyntaxhighlight>
 
{{out}}
<langsyntaxhighlight lang="Axiom">[1,4,9,16,25,36,49,64,81,100]
Type: List(Integer)</langsyntaxhighlight>
 
=={{header|Babel}}==
 
<langsyntaxhighlight lang="babel">((main {
{ iter
1 take bons 1 take
Line 201:
10 times
collect !
{eval %d nl <<} each }))</langsyntaxhighlight>
 
{{out}}
<langsyntaxhighlight lang="babel">100
81
64
Line 213:
9
4
1</langsyntaxhighlight>
 
Essentially, a function has been constructed for each value to be squared (10 down to 1). The cp operator ensures that we generate a fresh copy of the number to be squared, as well as the code for multiplying, {*}.
Line 219:
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( -1:?i
& :?funcs
& whl
Line 227:
& whl'(!funcs:%?func %?funcs&out$(!func$))
);
</syntaxhighlight>
</lang>
{{out}}
<pre>0
Line 245:
Non-portable. Copying a function body depends on implementation-specific semantics of volatile, if the replacement target still exists after optimization, if the dest memory is suitably aligned, if the memory is executable, if it makes any function calls to a relative offset, if it refers to any memory location with an absolute address, etc. It only very occasionally works.
 
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <string.h>
#include <stdlib.h>
Line 285:
return 0;
}</langsyntaxhighlight>
{{out}}
<syntaxhighlight lang="text">func[0]: 0
func[1]: 1
func[2]: 4
Line 295:
func[6]: 36
func[7]: 49
func[8]: 64</langsyntaxhighlight>
 
===Greenspunned mini Lisp dialect===
Line 301:
See [[Closures/Variable_capture/C]] for complete code. The relevant excerpt is:
 
<langsyntaxhighlight lang="c">void init(void)
{
t = intern(lit("t"));
Line 333:
}
return 0;
}</langsyntaxhighlight>
 
Here, we create an environment explicitly as an association list
Line 356:
=={{header|C sharp|C#}}==
===Using Linq===
<langsyntaxhighlight lang="csharp">using System;
using System.Linq;
 
Line 370:
}
}
}</langsyntaxhighlight>
{{out}}
<syntaxhighlight lang="text">0
1
4
Line 380:
36
49
64</langsyntaxhighlight>
 
===Using delegates only===
 
<langsyntaxhighlight lang="csharp">
using System;
using System.Collections.Generic;
Line 407:
}
}
</syntaxhighlight>
</lang>
{{out}}
<syntaxhighlight lang="text">0
1
4
Line 417:
36
49
64</langsyntaxhighlight>
 
=={{header|C++}}==
{{works with|C++11}}
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <functional>
#include <vector>
Line 432:
std::cout << f( ) << std::endl ;
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>0
Line 447:
 
=={{header|Ceylon}}==
<langsyntaxhighlight lang="ceylon">shared void run() {
//create a list of closures with a list comprehension
Line 455:
print("closure number ``i`` returns: ``closure()``");
}
}</langsyntaxhighlight>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(def funcs (map #(fn [] (* % %)) (range 11)))
(printf "%d\n%d\n" ((nth funcs 3)) ((nth funcs 4)))</langsyntaxhighlight>
{{Out}}
<pre>9
Line 466:
=={{header|CoffeeScript}}==
 
<langsyntaxhighlight lang="coffeescript">
# Generate an array of functions.
funcs = ( for i in [ 0...10 ] then do ( i ) -> -> i * i )
Line 472:
# Call each function to demonstrate value capture.
console.log func() for func in funcs
</syntaxhighlight>
</lang>
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">CL-USER> (defparameter alist
(loop for i from 1 to 10
collect (cons i (let ((i i))
Line 483:
4
CL-USER> (funcall (cdr (assoc 8 alist)))
64</langsyntaxhighlight>
 
The ''loop'' mutates its binding ''i''. The purpose of <code>(let ((i i)) ...)</code> is to create a different binding ''i'' for each ''lambda'' to capture. Otherwise, all 10 lambdas would capture the same binding and return 100.
Line 489:
=={{header|D}}==
===Less Functional Version===
<langsyntaxhighlight lang="d">import std.stdio;
 
void main() {
Line 498:
 
writeln(funcs[3]());
}</langsyntaxhighlight>
{{out}}
<pre>9</pre>
===More Functional Version===
<langsyntaxhighlight lang="d">void main() {
import std.stdio, std.range, std.algorithm;
 
10.iota.map!(i => () => i ^^ 2).map!q{ a() }.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]</pre>
Line 512:
=={{header|Delphi}}==
{{works with|Delphi 2009}}
<langsyntaxhighlight lang="Delphi">program Project1;
 
type
Line 538:
for i := Low(Funcs) to High(Funcs) do
Writeln(Funcs[i]());
end.</langsyntaxhighlight>
{{out}}
<pre>0
Line 555:
Dyalect captures variables by reference, therefore a way to achieve this is to capture a variable through a closure which in its turn returns a anonymous function like so:
 
<langsyntaxhighlight lang="dyalect">var xs = []
let num = 10
 
Line 564:
for x in xs {
print(x())
}</langsyntaxhighlight>
 
{{out}}
Line 582:
 
=={{header|EchoLisp}}==
<langsyntaxhighlight lang="scheme">
(define (fgen i) (lambda () (* i i)))
(define fs (for/vector ((i 10)) (fgen i))) ;; vector of 10 anonymous functions
((vector-ref fs 5)) ;; calls fs[5]
→ 25
</syntaxhighlight>
</lang>
 
=={{header|Elena}}==
ELENA 4.1 :
<langsyntaxhighlight lang="elena">import system'routines;
import extensions;
Line 599:
functions.forEach:(func) { console.printLine(func()) }
}</langsyntaxhighlight>
{{out}}
<pre>0
Line 613:
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">funs = for i <- 0..9, do: (fn -> i*i end)
Enum.each(funs, &IO.puts &1.())</langsyntaxhighlight>
 
{{out}}
Line 633:
As of Emacs 24.3, lexical closures are supported, therefore alleviating hacks such as lexical-let.
 
<langsyntaxhighlight lang="lisp">;; -*- lexical-binding: t; -*-
(mapcar #'funcall
(mapcar (lambda (x)
Line 639:
(* x x)))
'(1 2 3 4 5 6 7 8 9 10)))
;; => (1 4 9 16 25 36 49 64 81 100)</langsyntaxhighlight>
 
=={{header|Erlang}}==
Erlang uses lexical scoping and has anonymous functions.
<langsyntaxhighlight lang="erlang">
-module(capture_demo).
-export([demo/0]).
Line 657:
io:fwrite("~B~n",[F()])
end, Funs).
</syntaxhighlight>
</lang>
<pre>
1> capture_demo:demo().
Line 675:
=={{header|F_Sharp|F#}}==
Nearly identical to OCaml
<langsyntaxhighlight lang="fsharp">[<EntryPoint>]
let main argv =
let fs = List.init 10 (fun i -> fun () -> i*i)
do List.iter (fun f -> printfn "%d" <| f()) fs
0</langsyntaxhighlight>
 
With List.map
<langsyntaxhighlight lang="fsharp">[<EntryPoint>]
let main argv =
let fs = List.map (fun i -> fun () -> i*i) [0..9]
do List.iter (fun f -> printfn "%d" <| f()) fs
0</langsyntaxhighlight>
 
With List.mapi
<langsyntaxhighlight lang="fsharp">[<EntryPoint>]
let main argv =
let fs = List.mapi (fun i x -> fun () -> i*i) (List.replicate 10 None)
do List.iter (fun f -> printfn "%d" <| f()) fs
0</langsyntaxhighlight>
 
With an infinite sequence
<langsyntaxhighlight lang="fsharp">[<EntryPoint>]
let main argv =
let fs = Seq.initInfinite (fun i -> fun () -> i*i)
do Seq.iter (fun f -> printfn "%d" <| f()) (Seq.take 10 fs)
0</langsyntaxhighlight>
 
{{out}}
Line 718:
=={{header|Factor}}==
===Using lexical variables===
<langsyntaxhighlight lang="factor">USING: io kernel locals math prettyprint sequences ;
 
[let
Line 731:
seq nth call .
] each
]</langsyntaxhighlight>
 
<pre>$ ./factor script.factor
Line 744:
Forget the variable! Each ''fried quotation'' captures some values by pulling them from the stack.
 
<langsyntaxhighlight lang="factor">USING: fry io kernel math prettyprint sequences ;
 
! Push a sequence of 10 quotations
Line 755:
over nth call .
] each
drop</langsyntaxhighlight>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
class Closures
{
Line 777:
}
}
</syntaxhighlight>
</lang>
 
{{out}}
Line 785:
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: xt-array here { a }
10 cells allot 10 0 do
:noname i ]] literal dup * ; [[ a i cells + !
loop a ;
 
xt-array 5 cells + @ execute .</langsyntaxhighlight>
 
{{out}}
 
<syntaxhighlight lang ="forth">25</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
Line 800:
FreeBASIC doesn't support closures or anonymous methods, as such. However, what we can do is to create an array of objects to capture their index and then call a method on those objects which squares the index. This approach is similar to how some other object oriented languages implement closures 'under the hood'.
 
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Type Closure
Line 832:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 848:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 862:
fmt.Println("func #0:", fs[0]())
fmt.Println("func #3:", fs[3]())
}</langsyntaxhighlight>
{{out}}
<pre>
Line 871:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def closures = (0..9).collect{ i -> { -> i*i } }</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">assert closures instanceof List
assert closures.size() == 10
closures.each { assert it instanceof Closure }
println closures[7]()</langsyntaxhighlight>
 
{{out}}
Line 886:
Using <code>map</code>:
 
<langsyntaxhighlight lang="haskell">fs = map (\i _ -> i * i) [1 .. 10]</langsyntaxhighlight>
 
Using list comprehensions:
 
<langsyntaxhighlight lang="haskell">fs = [const $ i * i | i <- [1 .. 10]]</langsyntaxhighlight>
 
Using infinite lists:
 
<langsyntaxhighlight lang="haskell">fs = take 10 coFs where coFs = [const $ i * i | i <- [1 ..]]</langsyntaxhighlight>
 
Testing:
 
<langsyntaxhighlight lang="haskell">> :t fs
fs :: [b -> Integer]
> map ($ ()) fs
Line 905:
100
> fs !! 8 $ undefined
81</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
This uses Unicon specific calling sequences for co-expressions. It can be made to run under Icon by modifying the calling syntax.
 
<langsyntaxhighlight lang="Unicon">procedure main(args) # Closure/Variable Capture
every put(L := [], vcapture(1 to 10)) # build list of index closures
write("Randomly selecting L[",i := ?*L,"] = ",L[i]()) # L[i]() calls the closure
Line 924:
procedure makeProc(A) # the makeProc PDCO from the UniLib Utils package
return (@A[1], A[1])
end</langsyntaxhighlight>
 
{{libheader|Unicon Code Library}}
Line 935:
 
=={{header|Io}}==
<syntaxhighlight lang="text">blist := list(0,1,2,3,4,5,6,7,8,9) map(i,block(i,block(i*i)) call(i))
writeln(blist at(3) call) // prints 9</langsyntaxhighlight>
 
=={{header|J}}==
Line 944:
The natural way of implementing this in J is to define a function which produces a gerund of a constant function.
 
<langsyntaxhighlight lang="j">constF=:3 :0
{.''`(y "_)
)</langsyntaxhighlight>
 
Thus, a list of 10 functions each producing a value in 0..9, and another with their squares:
 
<langsyntaxhighlight lang="j">flist=: constF"0 i.10
slist=: constF"0 *:i.10</langsyntaxhighlight>
 
Referencing a function by its index (its position in that list):
 
<langsyntaxhighlight lang="j"> flist @.3
3"_
slist @.3
9"_</langsyntaxhighlight>
 
Using a function, given its index:
 
<langsyntaxhighlight lang="j"> flist @.4''
4
slist @.4''
16</langsyntaxhighlight>
 
Running a randomly picked function which is not the last one:
 
<langsyntaxhighlight lang="j"> flist@.(?9) ''
7
slist@.(?9) ''
25</langsyntaxhighlight>
 
===Tacit (unorthodox) version===
In J only adverbs and conjunctions (functionals) can produce verbs (functions)... Unless they are forced to cloak as verbs; in this instance, the rank conjunction (“) cloaks as a dyadic verb. (Note that this takes advantage of a bug/feature where the interpreter does not produce a result with [http://www.jsoftware.com/help/dictionary/dictb.htm the correct shape]):
 
<langsyntaxhighlight lang="j"> ( VL=. (<@:((<'"')(0:`)(,^:)&_))"0@:(^&2)@:i. 10 ) NB. Producing a list of boxed anonymous verbs (functions)
┌───┬───┬───┬───┬────┬────┬────┬────┬────┬────┐
│0"_│1"_│4"_│9"_│16"_│25"_│36"_│49"_│64"_│81"_│
Line 985:
25"_
{::&VL 5 '' NB. Invoking the 6th verb with a dummy argument ('')
25</langsyntaxhighlight>
 
=={{header|Java}}==
{{works with|Java|8+}}
<langsyntaxhighlight lang="java">import java.util.function.Supplier;
import java.util.ArrayList;
 
Line 1,003:
System.out.println(foo.get()); // prints "9"
}
}</langsyntaxhighlight>
 
Alternative implementation that also {{works with|Java|8+}}
<langsyntaxhighlight lang="java">import java.util.List;
import java.util.function.IntSupplier;
import java.util.stream.IntStream;
Line 1,022:
System.out.println(closure.getAsInt()); // prints "9"
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
Line 1,028:
===Imperative===
 
<langsyntaxhighlight lang="javascript">var funcs = [];
for (var i = 0; i < 10; i++) {
funcs.push( (function(i) {
Line 1,034:
})(i) );
}
window.alert(funcs[3]()); // alerts "9"</langsyntaxhighlight>
 
{{works with|JavaScript|1.7+}} (Firefox 2+)
<langsyntaxhighlight lang="javascript"><script type="application/javascript;version=1.7">
var funcs = [];
for (var i = 0; i < 10; i++) {
Line 1,045:
}
window.alert(funcs[3]()); // alerts "9"
</script></langsyntaxhighlight>
 
{{works with|JavaScript|ES6}}
<langsyntaxhighlight lang="javascript">"use strict";
let funcs = [];
for (let i = 0; i < 10; ++i) {
funcs.push((i => () => i*i)(i));
}
console.log(funcs[3]());</langsyntaxhighlight>
 
===Functional ===
Line 1,059:
{{works with|JavaScript|ES5}}
 
<langsyntaxhighlight lang="javascript">(function () {
'use strict';
 
Line 1,079:
return lstFns[3]();
 
})();</langsyntaxhighlight>
 
{{out}}
Line 1,087:
 
{{works with|JavaScript|ES6}}
<langsyntaxhighlight lang="javascript">let funcs = [...Array(10).keys()].map(i => () => i*i);</langsyntaxhighlight>
{{out}}
<pre>
Line 1,095:
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia">funcs = [ () -> i^2 for i = 1:10 ]</langsyntaxhighlight>
{{out}}
<pre>
Line 1,103:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
fun main(args: Array<String>) {
Line 1,110:
// call all but the last
(0 .. 8).forEach { println(funcs[it]()) }
}</langsyntaxhighlight>
 
{{out}}
Line 1,128:
 
A translation from Javascript
<langsyntaxhighlight lang="scheme">
{def A
{A.new
Line 1,139:
{A.get 4 {A}}
-> 16
</syntaxhighlight>
</lang>
 
=={{header|Latitude}}==
Line 1,145:
Latitude is particularly well suited to this challenge, as the various iteration constructs actually take method arguments and <i>call</i> them multiple times. Thus, the loop variable is in fact an argument which is already closed over and distinct at each iteration.
 
<langsyntaxhighlight lang="latitude">functions := 10 times to (Array) map {
takes '[i].
proc { (i) * (i). }.
}.
 
functions visit { println: $1 call. }.</langsyntaxhighlight>
 
{{Out}}
Line 1,167:
 
Input at the REPL:
<langsyntaxhighlight lang="lisp">
> (set funcs (list-comp ((<- m (lists:seq 1 10)))
(lambda () (math:pow m 2))))
</syntaxhighlight>
</lang>
 
Output:
<langsyntaxhighlight lang="lisp">
(#Fun<lfe_eval.23.101079464> #Fun<lfe_eval.23.101079464>
#Fun<lfe_eval.23.101079464> #Fun<lfe_eval.23.101079464>
Line 1,179:
#Fun<lfe_eval.23.101079464> #Fun<lfe_eval.23.101079464>
#Fun<lfe_eval.23.101079464> #Fun<lfe_eval.23.101079464>)
</syntaxhighlight>
</lang>
 
Calling the functions:
<langsyntaxhighlight lang="lisp">
> (funcall (car funcs))
1.0
Line 1,192:
64.0
 
</syntaxhighlight>
</lang>
 
=={{header|Lingo}}==
Line 1,198:
Lingo doesn't really support closures. But with the limitations described at [https://www.rosettacode.org/wiki/Function_composition#Lingo Function composition] and based on the fact that Lingo allows to create arbitrary code at runtime, the task can be solved like this:
 
<langsyntaxhighlight lang="lingo">-- parent script "CallFunction"
 
property _code
Line 1,221:
do(me._code)
return res
end</langsyntaxhighlight>
 
<langsyntaxhighlight lang="lingo">funcs = []
repeat with i = 1 to 10
code = "res="&i&"*"&i
Line 1,230:
 
put call(funcs[3], _movie)
-- 9</langsyntaxhighlight>
 
Since the original task is a little trivial in terms of not depending on runtime arguments, here also a solution for an extended task: let each function[i] return the square of i plus the sum of all arguments passed to it at runtime:
 
<langsyntaxhighlight lang="lingo">funcs = []
repeat with i = 1 to 10
code = ""
Line 1,248:
 
put call(funcs[7], _movie, 4, 5, 6)
-- 64</langsyntaxhighlight>
 
=={{header|Logtalk}}==
The example that follow uses Logtalk's native support for lambda expressions.
<langsyntaxhighlight lang="logtalk">
:- object(value_capture).
 
Line 1,268:
 
:- end_object.
</syntaxhighlight>
</lang>
{{out}}
<langsyntaxhighlight lang="text">
| ?- value_capture::show.
Closure 1 : 1
Line 1,283:
Closure 10 : 100
yes
</syntaxhighlight>
</lang>
 
=={{header|Lua}}==
<langsyntaxhighlight lang="Lua">
funcs={}
for i=1,10 do
Line 1,293:
funcs[2]()
funcs[3]()
</syntaxhighlight>
</lang>
{{out}}
<pre>4
Line 1,300:
 
=={{header|M2000 Interpreter}}==
<langsyntaxhighlight lang="M2000 Interpreter">
Dim Base 0, A(10)
For i=0 to 9 {
Line 1,308:
Print a(i)()
}
</syntaxhighlight>
</lang>
Print
0
Line 1,322:
 
Export list to clipboard
<langsyntaxhighlight lang="M2000 Interpreter">
document a$
For i=0 to 9 {
Line 1,329:
}
Clipboard a$
</syntaxhighlight>
</lang>
 
Using Inventory, and a stack object (reading from position, and another way, we pop functions, using Read)
 
 
<langsyntaxhighlight lang="M2000 Interpreter">
Inventory Alfa
For i=0 to 9 {
Line 1,362:
}
 
</syntaxhighlight>
</lang>
 
=={{header|Maple}}==
<langsyntaxhighlight lang="Maple">> L := map( i -> (() -> i^2), [seq](1..10) ):
> seq( L[i](),i=1..10);
1, 4, 9, 16, 25, 36, 49, 64, 81, 100
> L[4]();
16
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight lang="Mathematica">Function[i, i^2 &] /@ Range@10
->{1^2 &, 2^2 &, 3^2 &, 4^2 &, 5^2 &, 6^2 &, 7^2 &, 8^2 &, 9^2 &, 10^2 &}
 
%[[2]][]
->4</langsyntaxhighlight>
 
=={{header|Nemerle}}==
<langsyntaxhighlight lang="Nemerle">using System.Console;
 
module Closures
Line 1,392:
WriteLine($"$(funcs[2]())");
}
}</langsyntaxhighlight>
{{out}}
<pre>16
Line 1,398:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">var funcs: seq[proc(): int] = @[]
 
for i in 0..9:
Line 1,406:
 
for i in 0..8:
echo "func[", i, "]: ", funcs[i]()</langsyntaxhighlight>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">use Collection.Generic;
 
class Capture {
Line 1,425:
}
}
</syntaxhighlight>
</lang>
 
{{output}}
Line 1,443:
=={{header|Objective-C}}==
{{works with|Cocoa|Mac OS X 10.6+}} with ARC
<langsyntaxhighlight lang="objc">NSMutableArray *funcs = [[NSMutableArray alloc] init];
for (int i = 0; i < 10; i++) {
[funcs addObject:[^ { return i * i; } copy]];
Line 1,450:
int (^foo)(void) = funcs[3];
NSLog(@"%d", foo()); // logs "9"
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
Line 1,456:
All functions in OCaml are closures.
 
<langsyntaxhighlight lang="ocaml">let () =
let cls = Array.init 10 (fun i -> (function () -> i * i)) in
Random.self_init ();
Line 1,462:
let x = Random.int 9 in
Printf.printf " fun.(%d) = %d\n" x (cls.(x) ());
done</langsyntaxhighlight>
 
{{out}}
Line 1,475:
 
=={{header|Oforth}}==
<langsyntaxhighlight lang="Oforth">: newClosure(i) #[ i sq ] ;
10 seq map(#newClosure) at(7) perform .</langsyntaxhighlight>
 
{{out}}
Line 1,485:
=={{header|PARI/GP}}==
{{works with|PARI/GP|2.4.2 and above}}
<langsyntaxhighlight lang="parigp">vector(10,i,()->i^2)[5]()</langsyntaxhighlight>
 
{{out}}
Line 1,491:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">my @f = map(sub { $_ * $_ }, 0 .. 9); # @f is an array of subs
print $f[$_](), "\n" for (0 .. 8); # call and print all but last</langsyntaxhighlight>
{{out}}
<pre>
Line 1,508:
=={{header|Phix}}==
Phix does not support closures, but they seem easy enough to emulate
<!--<langsyntaxhighlight lang="Phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #000080;font-style:italic;">-- First some generic handling stuff, handles partial_args
Line 1,545:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" %d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">call_closure</span><span style="color: #0000FF;">(</span><span style="color: #000000;">cids</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],{}))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 1,559:
 
A dictionary based approach may prove somewhat easier:
<!--<langsyntaxhighlight lang="Phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">function</span> <span style="color: #000000;">square</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">tid</span><span style="color: #0000FF;">)</span>
Line 1,574:
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">" %d"</span><span style="color: #0000FF;">,</span><span style="color: #000000;">square</span><span style="color: #0000FF;">(</span><span style="color: #000000;">tids</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]))</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<!--</langsyntaxhighlight>-->
same output, for both tests
 
=={{header|Phixmonti}}==
<langsyntaxhighlight lang="Phixmonti">def power2
dup *
enddef
Line 1,594:
var i
i get i swap exec print " " print
endfor</langsyntaxhighlight>
 
=={{header|PHP}}==
{{works with|PHP|5.3+}}
<langsyntaxhighlight lang="php"><?php
$funcs = array();
for ($i = 0; $i < 10; $i++) {
Line 1,604:
}
echo $funcs[3](), "\n"; // prints 9
?></langsyntaxhighlight>
 
{{works with|PHP|pre-5.3}}
This method can capture value types like numbers, strings, arrays, etc., but not objects.
<langsyntaxhighlight lang="php"><?php
$funcs = array();
for ($i = 0; $i < 10; $i++) {
Line 1,614:
}
echo $funcs[3](), "\n"; // prints 9
?></langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight lang="PicoLisp">(setq FunList
(make
(for @N 10
(link (curry (@N) () (* @N @N))) ) ) )</langsyntaxhighlight>
Test:
<pre>: ((get FunList 2))
Line 1,629:
 
=={{header|Pike}}==
<langsyntaxhighlight lang="Pike">array funcs = ({});
foreach(enumerate(10);; int i)
{
Line 1,641:
}(i)
});
}</langsyntaxhighlight>
 
=={{header|PowerShell}}==
I'm not sure that I understood the question/task. This task seems to be the same as the 'Accumulator Factory' task.
<langsyntaxhighlight lang="PowerShell">
function Get-Closure ([double]$Number)
{
{param([double]$Sum) return $script:Number *= $Sum}.GetNewClosure()
}
</syntaxhighlight>
</lang>
<langsyntaxhighlight lang="PowerShell">
for ($i = 1; $i -lt 11; $i++)
{
Line 1,661:
}
}
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 1,677:
10 100
</pre>
<langsyntaxhighlight lang="PowerShell">
$numbers = 1..20 | Get-Random -Count 10
 
Line 1,689:
}
}
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 1,710:
'''lambda.pl''' can be found there : http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/lambda.pl
 
<langsyntaxhighlight lang="Prolog">:-use_module(library(lambda)).
 
 
Line 1,724:
call(F, R),
format('Func ~w : ~w~n', [N, R]).
</syntaxhighlight>
</lang>
{{out}}
<pre> ?- closure.
Line 1,742:
=={{header|Python}}==
The naive way does not work:
<langsyntaxhighlight lang="python">funcs = []
for i in range(10):
funcs.append(lambda: i * i)
print funcs[3]() # prints 81</langsyntaxhighlight>
 
The simplest solution is to add optional parameters with default arguments at the end of the parameter list, to create a local copy of the variable, and evaluate the variable at the time the function is created. (The optional parameter is not expected to ever be passed.) Often, the optional parameter will be named the same as the variable to be closed over (leading to odd-looking code of the form <code>foo=foo</code> in the arguments), so that the code inside the function need not be changed, but this might lead to confusion. This technique does not work for functions with a variable number of arguments.
<langsyntaxhighlight lang="python">funcs = []
for i in range(10):
funcs.append(lambda i=i: i * i)
print funcs[3]() # prints 9</langsyntaxhighlight>
or equivalently the list comprehension:
<langsyntaxhighlight lang="python">funcs = [lambda i=i: i * i for i in range(10)]
print funcs[3]() # prints 9</langsyntaxhighlight>
 
Another solution is to wrap an immediately-executed function around our function. The wrapping function creates a new scope, and its execution forces the evaluation of the variable to be closed over.
<langsyntaxhighlight lang="python">funcs = []
for i in range(10):
funcs.append((lambda i: lambda: i * i)(i))
print funcs[3]() # prints 9</langsyntaxhighlight>
or equivalently the list comprehension:
<langsyntaxhighlight lang="python">funcs = [(lambda i: lambda: i)(i * i) for i in range(10)]
print funcs[3]() # prints 9</langsyntaxhighlight>
 
In this case it is also possible to use <code>map()</code> since the function passed to it creates a new scope
<langsyntaxhighlight lang="python">funcs = map(lambda i: lambda: i * i, range(10))
print funcs[3]() # prints 9</langsyntaxhighlight>
 
It is also possible to use <code>eval</code>.
<langsyntaxhighlight lang="python">funcs=[eval("lambda:%s"%i**2)for i in range(10)]
print funcs[3]() # prints 9</langsyntaxhighlight>
 
=={{header|Quackery}}==
Line 1,777:
Strictly speaking, we could get away with <code>[ table 0 1 4 9 16 25 36 49 64 81 ] is functions ( n --> n )</code> for this task, as numbers in Quackery are functions that return their own value when executed, e.g <code>5 do</code> returns <code>5</code>, but it feels like cheating.
 
<langsyntaxhighlight lang="Quackery"> [ table ] is functions ( n --> [ )
 
10 times
Line 1,783:
' functions put ]
 
5 functions do echo</langsyntaxhighlight>
 
{{out}}
Line 1,796:
what you expect.
 
<syntaxhighlight lang="R">
<lang R>
# assign 's' a list of ten functions
s <- sapply (1:10, # integers 1..10 become argument 'x' below
Line 1,806:
s[[5]]() # call the fifth function in the list of returned functions
[1] 25 # returns vector of length 1 with the value 25
</syntaxhighlight>
</lang>
 
Note that I bound the captured variable as the default argument on a unary function.
Line 1,812:
ignores the default argument.
 
<syntaxhighlight lang="R">
<lang R>
s[[5]](10)
[1] 100
</syntaxhighlight>
</lang>
 
As a further technicality, note that you need some extra voodoo to '''modify''' the bound argument
with persistence across calls. This example increments the bound variable after each call.
 
<syntaxhighlight lang="R">
<lang R>
s <- sapply (1:10,
function (x) {
Line 1,839:
s[[1]]()
[1] 4 # now 2^2
</syntaxhighlight>
</lang>
 
As shown, each instance increments separately.
Line 1,848:
I think that modifying the bound variable can be done in a simpler way.
Instead of:
<langsyntaxhighlight lang="R"> evalq (x <- x + 1, parent.env(environment()))</langsyntaxhighlight>
substitute:
<langsyntaxhighlight lang="R"> x <<- x + 1</langsyntaxhighlight>
Testing:
<pre>
Line 1,868:
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(define functions (for/list ([i 10]) (λ() (* i i))))
(map (λ(f) (f)) functions)
</syntaxhighlight>
</lang>
{{out}}
<langsyntaxhighlight lang="racket">
'(0 1 4 9 16 25 36 49 64 81)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 1,882:
{{Works with|Rakudo|2015.12}}
All blocks are anonymous closures in Raku, and parameters are lexicals, so it's easy to generate a list of them. We'll use a <tt>gather</tt>/<tt>take</tt> generator loop, and call the closures in random order, just to keep things interesting.
<syntaxhighlight lang="raku" perl6line>my @c = gather for ^10 -> $i {
take { $i * $i }
}
 
.().say for @c.pick(*); # call them in random order</langsyntaxhighlight>
{{out}}
<pre>36
Line 1,899:
49</pre>
Or equivalently, using a more functional notation:
<syntaxhighlight lang="raku" perl6line>say .() for pick *, map -> $i { -> {$i * $i} }, ^10</langsyntaxhighlight>
 
=={{header|Red}}==
<langsyntaxhighlight lang="Red">
funs: collect [repeat i 10 [keep func [] reduce [i ** 2]]]
 
>> funs/7
== 49
</syntaxhighlight>
</lang>
 
=={{header|REXX}}==
Line 1,917:
 
No error checking is performed on the user input(s).
<langsyntaxhighlight lang="rexx">/*REXX program has a list of ten functions, each returns its invocation (index) squared.*/
parse arg seed base $ /*obtain optional arguments from the CL*/
if datatype(seed, 'W') then call random ,,seed /*Not given? Use random start seed. */
Line 1,941:
.9: return .(9) /* ' .9 " " " " */
/*──────────────────────────────────────────────────────────────────────────────────────*/
.: arg #; _=wordpos(#,$); if _==0 then return 'not in the list.'; return (_-(\base))**2</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input &nbsp; which assume a zero─based list):}}
<pre>
Line 1,954:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
x = funcs(7)
see x + nl
Line 1,964:
next
return fn
</syntaxhighlight>
</lang>
Output:
<pre>
Line 1,977:
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">procs = Array.new(10){|i| ->{i*i} } # -> creates a lambda
p procs[7].call # => 49</langsyntaxhighlight>
 
In Ruby, lambdas (and procs) are closures.
Line 1,986:
Rust employs strong ownership rules that do not allow mutating a value that is referenced (pointed to without allowing mutation) from elsewhere. It also doesn't allow referencing a value that may be dropped before the reference is released. The proof that we really did capture the value is therefore unnecessary. Either we did or it wouldn't have compiled.
 
<langsyntaxhighlight lang="rust">fn main() {
let fs: Vec<_> = (0..10).map(|i| {move || i*i} ).collect();
println!("7th val: {}", fs[7]());
}</langsyntaxhighlight>
 
{{out}}
Line 1,995:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">val closures=for(i <- 0 to 9) yield (()=>i*i)
0 to 8 foreach (i=> println(closures(i)()))
println("---\n"+closures(7)())</langsyntaxhighlight>
{{out}}
<pre>0
Line 2,013:
=={{header|Scheme}}==
 
<langsyntaxhighlight lang="scheme">;;; Collecting lambdas in a tail-recursive function.
(define (build-list-of-functions n i list)
(if (< i n)
Line 2,023:
(map (lambda (f) (f)) list-of-functions)
 
((list-ref list-of-functions 8))</langsyntaxhighlight>
 
{{out}}
<langsyntaxhighlight lang="scheme">'(1 4 9 16 25 36 49 64 81)
81</langsyntaxhighlight>
 
----
 
Using Scheme [http://srfi.schemers.org/srfi-1/srfi-1.html SRFI 1] ''iota'' procedure can be simplified to:
<langsyntaxhighlight lang="scheme">
(define list-of-functions (map (lambda (x) (lambda () (* x x))) (iota 0 1 10)))
 
Line 2,039:
(map (lambda (n) (n)) list-of-functions)
(newline)
</syntaxhighlight>
</lang>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">var f = (
10.of {|i| func(j){i * j} }
)
Line 2,048:
9.times { |j|
say f[j](j)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,063:
 
Starting from i=1:
<langsyntaxhighlight lang="ruby">var f = (1..10).map { |i|
func(j){i * j}
}
Line 2,069:
for j (1..9) {
say f[j-1](j)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,084:
 
=={{header|Smalltalk}}==
<langsyntaxhighlight lang="smalltalk">funcs := (1 to: 10) collect: [ :i | [ i * i ] ] .
(funcs at: 3) value displayNl .</langsyntaxhighlight>
{{out}}
<pre>9</pre>
Line 2,092:
In Sparkling, upvalues (variables in the closure) are captured by value.
 
<langsyntaxhighlight lang="sparkling">var fnlist = {};
for var i = 0; i < 10; i++ {
fnlist[i] = function() {
Line 2,100:
 
print(fnlist[3]()); // prints 9
print(fnlist[5]()); // prints 25</langsyntaxhighlight>
 
Alternately:
 
<langsyntaxhighlight lang="sparkling">var fnlist = map(range(10), function(k, v) {
return function() {
return v * v;
Line 2,111:
 
print(fnlist[3]()); // prints 9
print(fnlist[5]()); // prints 25</langsyntaxhighlight>
 
=={{header|Standard ML}}==
<langsyntaxhighlight lang="Standard ML">
List.map (fn x => x () ) ( List.tabulate (10,(fn i => (fn ()=> i*i)) ) ) ;
</langsyntaxhighlight> Output:
<langsyntaxhighlight lang="Standard ML">
val it = [0,1,4,9,16,25,36,49,64,81] : int list
</syntaxhighlight>
</lang>
 
=={{header|Swift}}==
By default, Swift captures variables by reference. A naive implementation like the following C-style for loop does not work:
<langsyntaxhighlight lang="swift">var funcs: [() -> Int] = []
for var i = 0; i < 10; i++ {
funcs.append({ i * i })
}
println(funcs[3]()) // prints 100</langsyntaxhighlight>
 
However, using a for-in loop over a range does work, since you get a new constant at every iteration:
<langsyntaxhighlight lang="swift">var funcs: [() -> Int] = []
for i in 0..<10 {
funcs.append({ i * i })
}
println(funcs[3]()) // prints 9</langsyntaxhighlight>
 
The C-style for loop can also work if we explicitly capture the loop counter:
<langsyntaxhighlight lang="swift">var funcs: [() -> Int] = []
for var i = 0; i < 10; i++ {
funcs.append({ [i] in i * i })
}
println(funcs[3]()) // prints 9</langsyntaxhighlight>
 
Alternately, we can also use <code>map()</code> to map over a range, and create the squaring closure inside the mapping closure which has the integer as a parameter:
<langsyntaxhighlight lang="swift">let funcs = [] + map(0..<10) {i in { i * i }}
println(funcs[3]()) // prints 9</langsyntaxhighlight>
 
=={{header|Tcl}}==
Tcl does not support closures (either value-capturing or variable-capturing) by default, but value-capturing closures are easy to emulate.
<langsyntaxhighlight lang="tcl">package require Tcl 8.6; # Just for tailcall command
# Builds a value-capturing closure; does NOT couple variables
proc closure {script} {
Line 2,184:
set idx [expr {int(rand()*9)}]; # pick random int from [0..9)
puts $idx=>[{*}[lindex $theClosures $idx]]
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,198:
====Sugared====
 
<langsyntaxhighlight lang="txrlisp">(let ((funs (mapcar (ret (op * @@1 @@1)) (range 1 10))))
[mapcar call [funs 0..-1]])</langsyntaxhighlight>
 
{{out}}
 
<langsyntaxhighlight lang="txrlisp">(1 4 9 16 25 36 49 64 81)</langsyntaxhighlight>
 
====Desugared====
Line 2,211:
The explicit <code>lambda</code> structure here is much like the implicit ones in the "Sugared" example:
 
<langsyntaxhighlight lang="txrlisp">;; Dropping distracting "skip last" requirement
;; (not implemented in original Elisp either).
(mapcar 'call
(mapcar (lambda ()
(lambda () (* x x))) '(1 2 3 4 5 6 7 8 9 10)))</langsyntaxhighlight>
 
====Delimited Continuations====
Line 2,255:
 
=={{header|Wren}}==
<langsyntaxhighlight lang="ecmascript">var fs = List.filled(10, null)
for (i in 0...fs.count) {
fs[i] = Fn.new { i * i }
}
 
for (i in 0...fs.count-1) System.print("Function #%(i): %(fs[i].call())")</langsyntaxhighlight>
 
{{out}}
Line 2,276:
 
=={{header|Yabasic}}==
<langsyntaxhighlight lang="Yabasic">
dim funcs$(10)
 
Line 2,290:
print execute(funcs$(i), i)
next
</syntaxhighlight>
</lang>
 
=={{header|zkl}}==
Create a closure of the index over a square function
<langsyntaxhighlight lang="zkl">(0).pump(10,List,fcn(i){i*i}.fp)[8]() //-->64
list:=(0).pump(10,List,fcn(i){i*i}.fp);
foreach n in (list.len()-1) { list[n]().println() }
list.run(True).println()</langsyntaxhighlight>
{{out}}
<pre>
10,327

edits