Here is another one, from http://www.paulgraham.com/accgen.html
The problem: Write a function foo that takes a number n and returns a function that takes a number i, and returns n incremented by i.
Note: (a) that's number, not integer, (b) that's incremented by, not plus.
Solutions from the link:
C++:
template<typename T> struct Acc { Acc(T n) : n(n) {} template<typename U> Acc(const Acc<U>& u) : n(u.n) {} template<typename U> T operator()(U i) { return n += i; } T n; }; template<typename T> Acc<T> foo(T n) { return Acc<T>(n); }C++11:
template<typename T> auto foo(T n) -> std::function<T(T)> { return [=](T i) mutable -> T {return n += i;}; }Dylan:
define function foo (n) method (i) n := n + i end; end function;E:
def foo (var n) :any { def inc (i) :any { n += i } }Erlang:
foop(N)-> receive {P,I}-> S =N+I, P!S, foop(S) end. foo(N)-> P=spawn(foo,foop,[N]), fun(I)-> P!{self(),I}, receive V->V end end.Haskell:
import IOExts foo n = do r <- newIORef n return (\i -> do modifyIORef r (+i) readIORef r)Javascript:
function foo (n) { return function (i) { return n += i } }Lisp: Arc:
(def foo (n) [++ n _])Lisp: Common Lisp:
(defun foo (n) (lambda (i) (incf n i)))Lisp: Goo:
(df foo (n) (op incf n _))Lisp: Scheme:
(define (foo n) (lambda (i) (set! n (+ n i)) n))Lua:
function foo(n) return function (i) n = n + i return n end endMaple:
foo := proc(n) local s; s := n; proc(i) s := s + i end endMathematica:
foo = Module[{s=#},s+=# &] &Mozart:
fun {Foo N} A = {NewCell? N} in fun {$ B} C D in {Exchange A C D} if {IsInt? C} andthen {IsFloat? B} then D = {IntToFloat? C}+B elseif {IsFloat? C} andthen {IsInt? B} then D = C+{IntToFloat? B} else D = C+B end {Access A} end endNewtonScript:
foo := func (n) func (i) n := n + i ;Perl 5:
sub foo { my ($n) = @_; sub {$n += shift} }PHP:
function foo(&$n) { return function($i)use(&$n) { return $n += $i; }; }Python:
class foo: def __init__(self, n): self.n = n def __call__(self, i): self.n += i return self.nRebol:
foo: func [ n ] [ func [ i ] [ n: n + i ] ]Ruby:
def foo (n) lambda {|i| n += i } endSmalltalk:
foo: n |s| s := n. ^[:i| s := s + i. ]VBScript:
Class acc Private n Public Default Function inc(i) n = n + i inc = n End Function End Class Function foo(n) Dim bar Set bar = New acc bar(n) Set foo = bar End Function