Higher-order functions: Difference between revisions

m
 
(30 intermediate revisions by 18 users not shown)
Line 12:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">F first(function)
R function()
 
Line 19:
 
V result = first(second)
print(result)</langsyntaxhighlight>
 
{{out}}
Line 25:
second
</pre>
=={{header|6502 Assembly}}==
For the most part, it's easier to call two functions back to back. However passing functions as arguments can still be done.
 
Code is called using the following macro, e.g. <code>PrintOutput #$FF,foo</code>. The printing routine is left unimplemented.
<syntaxhighlight lang="6502asm">macro PrintOutput,input,addr
; input: desired function's input
; addr: function you wish to call
LDA #<\addr ;#< represents this number's low byte
STA z_L
LDA #>\addr ;#> represents this number's high byte
STA z_H
LDA \input
JSR doPrintOutput
endm</syntaxhighlight>
 
<syntaxhighlight lang="6502asm">PrintOutput:
; prints the output of the function "foo" to the screen.
; input:
; A = input for the function "foo".
; z_L = contains the low byte of the memory address of "foo"
; z_H = contains the high byte of the memory address of "foo"
 
pha
 
LDA z_L
STA smc+1 ;store in the low byte of the operand
LDA z_H
STA smc+2 ;store in the high byte of the operand
 
pla
 
smc:
JSR $1234
;uses self-modifying code to overwrite the destination with the address of the passed function.
;assuming that function ends in an RTS, execution will return to this line after the function is done.
JSR PrintAccumulator
 
rts</syntaxhighlight>
=={{header|68000 Assembly}}==
This trivial example shows a simple return spoof.
<syntaxhighlight lang="68000devpac">LEA foo,A0
JSR bar
 
JMP * ;HALT
 
bar:
MOVE.L A0,-(SP)
RTS ;JMP foo
 
foo:
RTS ;do nothing and return. This rts retuns execution just after "JSR bar" but before "JMP *".</syntaxhighlight>
 
 
=={{header|8th}}==
<langsyntaxhighlight lang="forth">
: pass-me
"I was passed\n" . ;
Line 34 ⟶ 86:
\ pass 'pass-me' to 'passer'
' pass-me passer
</syntaxhighlight>
</lang>
{{out}}
I was passed
 
=={{header|ActionScript}}==
<langsyntaxhighlight lang="actionscript">package {
public class MyClass {
 
Line 57 ⟶ 109:
}
}
}</langsyntaxhighlight>
 
=={{header|Ada}}==
===Simple Example===
<langsyntaxhighlight lang="ada">with Ada.Text_Io; use Ada.Text_Io;
 
procedure Subprogram_As_Argument is
Line 77 ⟶ 129:
begin
First(Second'Access);
end Subprogram_As_Argument;</langsyntaxhighlight>
===Complex Example===
<langsyntaxhighlight lang="ada">with Ada.Text_Io; use Ada.Text_Io;
 
procedure Subprogram_As_Argument_2 is
Line 130 ⟶ 182:
Int_Ptr := Complex_Func(F_Ptr, 3);
Put_Line(Integer'Image(Int_Ptr.All));
end Subprogram_As_Argument_2;</langsyntaxhighlight>
 
=={{header|Aime}}==
<langsyntaxhighlight lang="aime">integer
average(integer p, integer q)
{
Line 157 ⟶ 209:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
Line 164 ⟶ 216:
{{works with|ALGOL 68G|Any - tested with release [http://sourceforge.net/projects/algol68/files/algol68g/algol68g-1.18.0/algol68g-1.18.0-9h.tiny.el5.centos.fc11.i386.rpm/download 1.18.0-9h.tiny]}}
{{wont work with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d] - due to extensive use of FORMATted transput}}
<langsyntaxhighlight lang="algol68">PROC first = (PROC(LONG REAL)LONG REAL f) LONG REAL:
(
f(1) + 2
Line 176 ⟶ 228:
main: (
printf(($xg(5,2)l$,first(second)))
)</langsyntaxhighlight>
Output:
<pre>
Line 184 ⟶ 236:
=={{header|AmigaE}}==
The <tt>{}</tt> takes the pointer to an object (code/functions, variables and so on); Amiga E does not distinguish nor check anything, so it is up to the programmer to use the pointer properly. For this reason, a warning is always raised when a ''variable'' (<tt>func</tt>, holding a pointer to a real function in our case) is used like a function.
<langsyntaxhighlight lang="amigae">PROC compute(func, val)
DEF s[10] : STRING
WriteF('\s\n', RealF(s,func(val),4))
Line 195 ⟶ 247:
compute({sin_wrap}, 0.0)
compute({cos_wrap}, 3.1415)
ENDPROC</langsyntaxhighlight>
 
=={{header|AntLang}}==
<langsyntaxhighlight AntLanglang="antlang">twice:{x[x[y]]}
echo twice "Hello!"</langsyntaxhighlight>
 
=={{header|AppleScript}}==
<langsyntaxhighlight lang="applescript">-- This handler takes a script object (singer)
-- with another handler (call).
on sing about topic by singer
Line 226 ⟶ 278:
end script
end hire
sing about "closures" by (hire for "Pipe Organ")</langsyntaxhighlight>
 
As we can see above, AppleScript functions (referred to as 'handlers' in Apple's documentation) are not, in themselves, first class objects. They can only be applied within other functions, when passed as arguments, if wrapped in Script objects. If we abstract out this lifting of functions into objects by writing an '''mReturn''' or '''mInject''' function, we can then use it to write some higher-order functions which directly accept unadorned AppleScript handlers as arguments.
Line 232 ⟶ 284:
We could, for example, write '''map''', '''fold/reduce''' and '''filter''' functions for AppleScript as follows:
 
<langsyntaxhighlight lang="applescript">on run
-- PASSING FUNCTIONS AS ARGUMENTS TO
-- MAP, FOLD/REDUCE, AND FILTER, ACROSS A LIST
Line 346 ⟶ 398:
on isEven(x)
x mod 2 = 0
end isEven</langsyntaxhighlight>
{{Out}}
<langsyntaxhighlight lang="applescript">{{0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
{0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100},
{true, false, true, false, true, false, true, false, true, false, true}}</langsyntaxhighlight>
 
===Alternative description===
Line 356 ⟶ 408:
In plain English, one handler can be passed as a parameter to another either in a script object …
 
<langsyntaxhighlight lang="applescript">script aScript
on aHandler(aParameter)
say aParameter
Line 366 ⟶ 418:
end receivingHandler
 
receivingHandler(aScript)</langsyntaxhighlight>
 
… or directly, with the passed pointer being assigned to a script object property upon receipt:
 
<langsyntaxhighlight lang="applescript">on aHandler(aParameter)
say aParameter
end aHandler
Line 382 ⟶ 434:
end receivingHandler
 
receivingHandler(aHandler)</langsyntaxhighlight>
 
It's not often that handlers actually need to be passed as parameters, but passing them in script objects is usually more flexible as additional information on which they depend can then be included if required which the receiving handler doesn't need to know.
Line 389 ⟶ 441:
 
=={{header|Arturo}}==
<langsyntaxhighlight lang="arturo">doSthWith: function [x y f][
f x y
]
 
print [ "add:" doSthWith 2 3 $[x y][x+y] ]
print [ "multiply:" doSthWith 2 3 $[x y][x*y] ]</langsyntaxhighlight>
{{out}}
<pre>add: 5
Line 400 ⟶ 452:
 
=={{header|ATS}}==
<syntaxhighlight lang="ats">
<lang ATS>
#include
"share/atspre_staload.hats"
Line 414 ⟶ 466:
//
} (* end of [main0] *)
</syntaxhighlight>
</lang>
 
=={{header|AutoHotkey}}==
<syntaxhighlight lang="autohotkey">
<lang AutoHotkey>
f(x) {
return "This " . x
Line 433 ⟶ 485:
show("g") ; or just name the function
return
</syntaxhighlight>
</lang>
 
=={{header|BBC BASIC}}==
{{works with|BBC BASIC for Windows}}
<langsyntaxhighlight lang="bbcbasic"> REM Test passing a function to a function:
PRINT FNtwo(FNone(), 10, 11)
END
Line 445 ⟶ 497:
REM Function taking a function as an argument:
DEF FNtwo(RETURN f%, x, y) = FN(^f%)(x, y)</langsyntaxhighlight>
'''Output:'''
<pre>
441
</pre>
 
=={{header|Binary Lambda Calculus}}==
Every BLC program uses higher order functions, since the parsed lambda term is applied to the remainder of input, which is, like everything in lambda calculus, itself a function. For example, the empty input is nil = <code>\x\y.y</code>. So the following minimal 4-bit BLC program passes nil to the identity function:
 
<pre>0010</pre>
 
=={{header|BQN}}==
BQN has built-in support for higher order functions.
 
A function's name in lowercase can be used to pass it as a subject, rather than a function to be executed.
<syntaxhighlight lang="bqn">Uniq ← ⍷
 
•Show uniq {𝕎𝕩} 5‿6‿7‿5</syntaxhighlight><syntaxhighlight lang="text">⟨ 5 6 7 ⟩</syntaxhighlight>
[https://mlochbaum.github.io/BQN/try.html#code=VW5pcSDihpAg4o23CgrigKJTaG93IHVuaXEge/CdlY7wnZWpfSA14oC/NuKAvzfigL81 Try It!]
 
=={{header|Bracmat}}==
<langsyntaxhighlight lang="bracmat">( (plus=a b.!arg:(?a.?b)&!a+!b)
& ( print
= text a b func
Line 465 ⟶ 531:
. multiply
)
);</langsyntaxhighlight>
Output:
<pre>add(3,7)=10
Line 471 ⟶ 537:
 
=={{header|Brat}}==
<langsyntaxhighlight lang="brat">add = { a, b | a + b }
 
doit = { f, a, b | f a, b }
 
p doit ->add 1 2 #prints 3</langsyntaxhighlight>
 
=={{header|Bruijn}}==
Everything in bruijn is a function (including strings and numbers), so even <syntaxhighlight lang="bruijn">main [0]</syntaxhighlight> would be a valid solution since the argument of <code>main</code> is already a functional encoding of stdin.
 
A more obvious example:
<syntaxhighlight lang="bruijn">
first [0 [[0]]]
 
second [first [[1]]]
 
:test (second) ([[[[0]]]])
</syntaxhighlight>
 
=={{header|Burlesque}}==
Line 482 ⟶ 560:
The function "m[" (map) takes a block (a 'function') as it's argument. Add 5 to every element in a list (like map (+5) [1,2,3,4] in haskell):
 
<langsyntaxhighlight lang="burlesque">
blsq ) {1 2 3 4}{5.+}m[
{6 7 8 9}
</syntaxhighlight>
</lang>
 
=={{header|C}}==
Line 494 ⟶ 572:
Definition of a function whose only parameter is a pointer to a function with no parameters and no return value:
 
<langsyntaxhighlight lang="c">void myFuncSimple( void (*funcParameter)(void) )
{
/* ... */
Line 502 ⟶ 580:
 
/* ... */
}</langsyntaxhighlight>
 
Note that you ''can't'' call the passed function by " *funcParameter() ", since that would mean "call funcParameter and then apply the * operator on the returned value".
Line 508 ⟶ 586:
Call:
 
<langsyntaxhighlight lang="c">void funcToBePassed(void);
 
/* ... */
 
myFuncSimple(&funcToBePassed);</langsyntaxhighlight>
 
'''Complex example'''
Line 518 ⟶ 596:
Definition of a function whose return value is a pointer to int and whose only parameter is a pointer to a function, whose (in turn) return value is a pointer to double and whose only parameter is a pointer to long.
 
<langsyntaxhighlight lang="c">int* myFuncComplex( double* (*funcParameter)(long* parameter) )
{
long inLong;
Line 530 ⟶ 608:
 
/* ... */
}</langsyntaxhighlight>
Call:
 
<langsyntaxhighlight lang="c">double* funcToBePassed(long* parameter);
 
/* ... */
Line 539 ⟶ 617:
int* outInt;
 
outInt = myFuncComplex(&funcToBePassed);</langsyntaxhighlight>
 
'''Pointer'''
Line 545 ⟶ 623:
Finally, declaration of a pointer variable of the proper type to hold such a function as myFunc:
 
<langsyntaxhighlight lang="c">int* (*funcPointer)( double* (*funcParameter)(long* parameter) );
 
/* ... */
 
funcPointer = &myFuncComplex;</langsyntaxhighlight>
 
Of course, in a real project you shouldn't write such a convoluted code, but use some typedef instead, in order to break complexity into steps.
Line 567 ⟶ 645:
This implementation works in all standard versions of C#.
 
<langsyntaxhighlight lang="csharp">using System;
 
// A delegate declaration. Because delegates are types, they can exist directly in namespaces.
Line 609 ⟶ 687:
Console.WriteLine("f=Div, f({0}, {1}) = {2}", a, b, Call(div, a, b));
}
}</langsyntaxhighlight>
 
===C# 2.0: Anonymous methods===
Anonymous methods were added in C# 2.0. Parameter types must be specified. Anonymous methods must be "coerced" to a delegate type known at compile-time; they cannot be used with a target type of Object or to initialize implicitly typed variables.
 
<langsyntaxhighlight lang="csharp">using System;
 
delegate int Func2(int a, int b);
Line 634 ⟶ 712:
Console.WriteLine("f=Div, f({0}, {1}) = {2}", a, b, Call(delegate(int x, int y) { return x / y; }, a, b));
}
}</langsyntaxhighlight>
 
==={{anchor|C#: Lambda expressions}}C# 3.0: Lambda expressions===
Line 645 ⟶ 723:
{{works with|C sharp|C#|3+}}
 
<langsyntaxhighlight lang="csharp">using System;
 
class Program
Line 668 ⟶ 746:
Console.WriteLine("f=Div, f({0}, {1}) = {2}", a, b, Call((x, y) => x / y, a, b));
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
Line 685 ⟶ 763:
 
{{works with|gcc|4.4}}
<langsyntaxhighlight lang="cpp">
// Use <functional> for C++11
#include <tr1/functional>
Line 707 ⟶ 785:
first(second);
}
</syntaxhighlight>
</lang>
 
===Template and Inheritance===
Line 713 ⟶ 791:
{{works with|Visual C++|2005}}
 
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <functional>
 
Line 735 ⟶ 813:
std::cout << first(second(), 2) << std::endl;
return 0;
}</langsyntaxhighlight>
 
=={{header|Clean}}==
Take a function as an argument and apply it to all elements in a list:
<langsyntaxhighlight lang="clean">map f [x:xs] = [f x:map f xs]
map f [] = []</langsyntaxhighlight>
Pass a function as an argument:
<langsyntaxhighlight lang="clean">incr x = x + 1
 
Start = map incr [1..10]</langsyntaxhighlight>
Do the same using a anonymous function:
<langsyntaxhighlight lang="clean">Start = map (\x -> x + 1) [1..10]</langsyntaxhighlight>
Do the same using currying:
<langsyntaxhighlight lang="clean">Start = map ((+) 1) [1..10]</langsyntaxhighlight>
 
=={{header|Clojure}}==
 
<langsyntaxhighlight lang="lisp">
(defn append-hello [s]
(str "Hello " s))
Line 760 ⟶ 838:
 
(println (modify-string append-hello "World!"))
</syntaxhighlight>
</lang>
 
=={{header|CLU}}==
<syntaxhighlight lang="clu">% Functions can be passed to other functions using the 'proctype'
% type generator. The same works for iterators, using 'itertype'
 
% Here are two functions
square = proc (n: int) returns (int) return (n*n) end square
cube = proc (n: int) returns (int) return (n*n*n) end cube
 
% Here is a function that takes another function
do_calcs = proc (from, to: int, title: string,
fn: proctype (int) returns (int))
po: stream := stream$primary_output()
stream$putleft(po, title, 8)
stream$puts(po, " -> ")
for i: int in int$from_to(from,to) do
stream$putright(po, int$unparse(fn(i)), 5)
end
stream$putc(po, '\n')
end do_calcs
 
start_up = proc ()
do_calcs(1, 10, "Squares", square)
do_calcs(1, 10, "Cubes", cube)
end start_up</syntaxhighlight>
{{out}}
<pre>Squares -> 1 4 9 16 25 36 49 64 81 100
Cubes -> 1 8 27 64 125 216 343 512 729 1000</pre>
 
=={{header|CoffeeScript}}==
Line 766 ⟶ 873:
Passing an anonymous function to built-in map/reduce functions:
 
<langsyntaxhighlight lang="coffeescript">double = [1,2,3].map (x) -> x*2</langsyntaxhighlight>
 
Using a function stored in a variable:
 
<langsyntaxhighlight lang="coffeescript">fn = -> return 8
sum = (a, b) -> a() + b()
sum(fn, fn) # => 16
</syntaxhighlight>
</lang>
 
List comprehension with a function argument:
 
<langsyntaxhighlight lang="coffeescript">bowl = ["Cheese", "Tomato"]
 
smash = (ingredient) ->
Line 784 ⟶ 891:
contents = smash ingredient for ingredient in bowl
# => ["Smashed Cheese", "Smashed Tomato"]
</syntaxhighlight>
</lang>
 
Nested function passing:
 
<langsyntaxhighlight lang="coffeescript">double = (x) -> x*2
triple = (x) -> x*3
addOne = (x) -> x+1
 
addOne triple double 2 # same as addOne(triple(double(2)))</langsyntaxhighlight>
 
A function that returns a function that returns a function that returns a function that returns 2, immediately executed:
 
<langsyntaxhighlight lang="coffeescript">(-> -> -> -> 2 )()()()() # => 2</langsyntaxhighlight>
 
A function that takes a function that takes a function argument:
 
<langsyntaxhighlight lang="coffeescript">((x)->
2 + x(-> 5)
)((y) -> y()+3)
# result: 10</langsyntaxhighlight>
 
=={{header|Common Lisp}}==
In Common Lisp, functions are [[wp:First-class_object|first class objects]], so you can pass function objects as arguments to other functions:
 
<langsyntaxhighlight lang="lisp">CL-USER> (defun add (a b) (+ a b))
ADD
CL-USER> (add 1 2)
Line 816 ⟶ 923:
CALL-IT
CL-USER> (call-it #'add 1 2)
3</langsyntaxhighlight>
The Common Lisp library makes extensive use of higher-order functions:
<pre>CL-USER> (funcall #'+ 1 2 3)
Line 831 ⟶ 938:
 
=={{header|Cowgol}}==
<langsyntaxhighlight lang="cowgol">include "cowgol.coh";
 
# In order to pass functions around, you must first define an interface.
Line 883 ⟶ 990:
end sub;
 
showAll(&operators[0], 84, 42); # example</langsyntaxhighlight>
 
{{out}}
Line 893 ⟶ 1,000:
 
=={{header|D}}==
<langsyntaxhighlight lang="d">int hof(int a, int b, int delegate(int, int) f) {
return f(a, b);
}
Line 901 ⟶ 1,008:
writeln("Add: ", hof(2, 3, (a, b) => a + b));
writeln("Multiply: ", hof(2, 3, (a, b) => a * b));
}</langsyntaxhighlight>
{{out}}
<pre>Add: 5
Multiply: 6</pre>
This longer and more systematic example shows D functions/delegates by passing each type of function/delegate to _test_ as argument.
<langsyntaxhighlight lang="d">import std.stdio;
 
// Test the function argument.
Line 966 ⟶ 1,073:
"Literal".test(function string() { return "literal.F"; })
.test(delegate string() { return "literal.D"; });
}</langsyntaxhighlight>
{{out}}}
<pre>Hi, Function : scope: Global (function) : immutable(char)[]()*
Line 985 ⟶ 1,092:
 
=={{header|DWScript}}==
<langsyntaxhighlight lang="delphi">type TFnType = function(x : Float) : Float;
function First(f : TFnType) : Float;
Line 997 ⟶ 1,104:
end;
PrintLn(First(Second));</langsyntaxhighlight>
 
=={{header|Dyalect}}==
Line 1,003 ⟶ 1,110:
{{trans|C#}}
 
<langsyntaxhighlight Dyalectlang="dyalect">func call(f, a, b) {
f(a, b)
}
Line 1,012 ⟶ 1,119:
print("f=add, f(\(a), \(b)) = \(call((x, y) => x + y, a, b))")
print("f=mul, f(\(a), \(b)) = \(call((x, y) => x * y, a, b))")
print("f=div, f(\(a), \(b)) = \(call((x, y) => x / y, a, b))")</langsyntaxhighlight>
 
{{out}}
Line 1,021 ⟶ 1,128:
 
=={{header|Déjà Vu}}==
<langsyntaxhighlight lang="dejavu">map f lst:
]
for item in lst:
Line 1,030 ⟶ 1,137:
* 2
 
!. map @twice [ 1 2 5 ]</langsyntaxhighlight>
{{out}}
<pre>[ 2 4 10 ]</pre>
 
=={{header|Draco}}==
<syntaxhighlight lang="draco">/* Example functions - there are no anonymous functions */
proc nonrec square(word n) word: n*n corp
proc nonrec cube(word n) word: n*n*n corp
 
/* A function that takes another function.
* Note how a function is defined as:
* proc name(arguments) returntype: [code here] corp
* But a function variable is instead defined as:
* proc(arguments) returntype name
*/
proc nonrec do_func(word start, stop; proc(word n) word fn) void:
word n;
for n from start upto stop do
write(fn(n):8)
od;
writeln()
corp
 
/* We can then just pass the name of a function as an argument */
proc main() void:
do_func(1, 10, square);
do_func(1, 10, cube)
corp</syntaxhighlight>
{{out}}
<pre> 1 4 9 16 25 36 49 64 81 100
1 8 27 64 125 216 343 512 729 1000</pre>
=={{header|E}}==
<langsyntaxhighlight lang="e">def map(f, list) {
var out := []
for x in list {
Line 1,051 ⟶ 1,185:
? def foo(x) { return -(x.size()) }
> map(foo, ["", "a", "bc"])
# value: [0, -1, -2]</langsyntaxhighlight>
 
=={{header|ECL}}==
<syntaxhighlight lang="text">//a Function prototype:
INTEGER actionPrototype(INTEGER v1, INTEGER v2) := 0;
 
Line 1,104 ⟶ 1,238:
OUTPUT(doMany(2, applyValue4, applyValue2,multiValues));
// produces "24:12"</langsyntaxhighlight>
 
=={{header|Efene}}==
 
<langsyntaxhighlight lang="efene">first = fn (F) {
F()
}
Line 1,131 ⟶ 1,265:
first(F2)
}
</syntaxhighlight>
</lang>
 
=={{header|Elena}}==
{{trans|Smalltalk}}
ELENA 46.1x :
<langsyntaxhighlight lang="elena">import extensions;
public program()
{
var first := (f => f());
var second := { ^ "second" };
console.printLine(first(second))
}</langsyntaxhighlight>
{{out}}
<pre>second</pre>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">iex(1)> defmodule RC do
...(1)> def first(f), do: f.()
...(1)> def second, do: :hello
Line 1,164 ⟶ 1,298:
#Function<20.54118792/0 in :erl_eval.expr/5>
iex(5)> RC.first(f)
:world</langsyntaxhighlight>
 
=={{header|Erlang}}==
 
Erlang functions are atoms, and they're considered different functions if their arity (the number of arguments they take) is different. As such, an Erlang function must be passed as <code>fun Function/Arity</code>, but can be used as any other variable:
<langsyntaxhighlight lang="erlang">-module(test).
-export([first/1, second/0]).
 
first(F) -> F().
second() -> hello.</langsyntaxhighlight>
Testing it:
<langsyntaxhighlight lang="erlang">1> c(tests).
{ok, tests}
2> tests:first(fun tests:second/0).
hello
3> tests:first(fun() -> anonymous_function end).
anonymous_function</langsyntaxhighlight>
 
=={{header|ERRE}}==
ERRE function are limited to one-line FUNCTION, but you can write:
<syntaxhighlight lang="erre">
<lang ERRE>
PROGRAM FUNC_PASS
 
Line 1,198 ⟶ 1,332:
PRINT(TWO(10,11))
END PROGRAM
</syntaxhighlight>
</lang>
Answer is 442
 
=={{header|Euler Math Toolbox}}==
 
<syntaxhighlight lang="euler math toolbox">
<lang Euler Math Toolbox>
>function f(x,a) := x^a-a^x
>function dof (f$:string,x) := f$(x,args());
Line 1,209 ⟶ 1,343:
[ -1 0 1 0 -7 ]
>plot2d("f",1,5;2):
</syntaxhighlight>
</lang>
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">procedure use(integer fi, integer a, integer b)
print(1,call_func(fi,{a,b}))
end procedure
Line 1,220 ⟶ 1,354:
end function
 
use(routine_id("add"),23,45)</langsyntaxhighlight>
 
=={{header|F Sharp|F#}}==
We define a function that takes another function f as an argument and applies that function twice to the argument x:
<langsyntaxhighlight lang="fsharp">> let twice f x = f (f x);;
 
val twice : ('a -> 'a) -> 'a -> 'a
 
> twice System.Math.Sqrt 81.0;;
val it : float = 3.0</langsyntaxhighlight>
 
Another example, using an operator as a function:
<langsyntaxhighlight lang="fsharp">> List.map2 (+) [1;2;3] [3;2;1];;
val it : int list = [4; 4; 4]</langsyntaxhighlight>
 
=={{header|Factor}}==
Using words (factor's functions) :
<langsyntaxhighlight lang="factor">USING: io ;
IN: rosetacode
: argument-function1 ( -- ) "Hello World!" print ;
Line 1,250 ⟶ 1,384:
! Stack effect has to be written for runtime computed values :
: calling-function3 ( bool -- ) \ argument-function1 \ argument-function2 ? execute( -- ) ;
</syntaxhighlight>
</lang>
 
( scratchpad )
Line 1,265 ⟶ 1,399:
=={{header|FALSE}}==
Anonymous code blocks are the basis of FALSE control flow and function definition. These blocks may be passed on the stack as with any other parameter.
<langsyntaxhighlight lang="false">[f:[$0>][@@\f;!\1-]#%]r: { reduce n stack items using the given basis and binary function }
 
1 2 3 4 0 4[+]r;!." " { 10 }
1 2 3 4 1 4[*]r;!." " { 24 }
1 2 3 4 0 4[$*+]r;!. { 30 }</langsyntaxhighlight>
 
=={{header|Fantom}}==
 
<langsyntaxhighlight lang="fantom">
class Main
{
Line 1,288 ⟶ 1,422:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Forth}}==
Forth words can be referenced on the stack via their ''execution token'' or XT. An XT is obtained from a word via the quote operator, and invoked via '''EXECUTE'''. Anonymous functions may be defined via ''':NONAME''' (returning an XT) instead of a standard colon definition.
 
<langsyntaxhighlight lang="forth">: square dup * ;
: cube dup dup * * ;
: map. ( xt addr len -- )
Line 1,301 ⟶ 1,435:
' square array 5 map. cr \ 1 4 9 16 25
' cube array 5 map. cr \ 1 8 27 64 125
:noname 2* 1+ ; array 5 map. cr \ 3 5 7 9 11</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
use the EXTERNAL attribute to show the dummy argument is another function rather than a data object. i.e.
<langsyntaxhighlight lang="fortran">FUNCTION FUNC3(FUNC1, FUNC2, x, y)
REAL, EXTERNAL :: FUNC1, FUNC2
REAL :: FUNC3
Line 1,312 ⟶ 1,446:
 
FUNC3 = FUNC1(x) * FUNC2(y)
END FUNCTION FUNC3</langsyntaxhighlight>
 
Another way is to put the functions you want to pass in a module:
 
<langsyntaxhighlight lang="fortran">module FuncContainer
implicit none
contains
Line 1,365 ⟶ 1,499:
end subroutine asubroutine
 
end program FuncArg</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Function square(n As Integer) As Integer
Line 1,390 ⟶ 1,524:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 1,401 ⟶ 1,535:
The following defines an anonymous function and passes it to another function. In this case, the anonymous function is a comparison function that sorts by string length.
 
<langsyntaxhighlight lang="frink">
cmpFunc = {|a,b| length[a] <=> length[b]}
 
a = ["tree", "apple", "bee", "monkey", "z"]
sort[a, cmpFunc]
</syntaxhighlight>
</lang>
 
You can also look up functions by name and number of arguments. The following is equivalent to the previous example.
 
<langsyntaxhighlight lang="frink">
lengthCompare[a,b] := length[a] <=> length[b]
 
Line 1,416 ⟶ 1,550:
a = ["tree", "apple", "bee", "monkey", "z"]
sort[a, func]
</syntaxhighlight>
</lang>
 
=={{header|FutureBasic}}==
<langsyntaxhighlight lang="futurebasic">window 1
include "ConsoleWindow"
 
dim as pointer functionOneAddress
Line 1,430 ⟶ 1,563:
 
print fn FunctionTwo( 12, 12 )
 
</lang>
HandleEvents</syntaxhighlight>
 
Output:
Line 1,439 ⟶ 1,573:
=={{header|Fōrmulæ}}==
 
In [http{{FormulaeEntry|page=https://wiki.formulae.org/?script=examples/Higher-order_functions this] page you can see the solution of this task.}}
 
'''Solution'''
 
'''Case 1 (from Rosetta code)''' Passing a function as an argument to another function.
 
The following function takes a function as its first parameter, and other two parameters, x and y. When this function "Do" is called, it will perform the given function taking as arguments the values x and y.
 
[[File:Fōrmulæ - Higher-order functions 01.png]]
 
[[File:Fōrmulæ - Higher-order functions 02.png]]
 
[[File:Fōrmulæ - Higher-order functions 03.png]]
 
An anonymous function (a lambda expression) can be passed directly:
 
[[File:Fōrmulæ - Higher-order functions 04.png]]
 
[[File:Fōrmulæ - Higher-order functions 05.png]]
 
For the next example, the function to be passed, when invoked, will perform several operation to the same two arguments. It will add them, subtract them, multiply them, divide them and power them. Finally it will return a list with the results.
 
[[File:Fōrmulæ - Higher-order functions 06.png]]
 
[[File:Fōrmulæ - Higher-order functions 07.png]]
 
Up now, however, it is the half of the story. Let us build an example where a function takes a function as parameter, and returns another function.
 
'''Case 2 (from Wikipedia)''' Passing a function as an argument to another function, and returning a function
 
The following function is a higher-order function. It takes as its unique parameter the function f. When the function is invoked, it will apply twice the function f and will return it. In other words, it will return a new function, which is the composition of the function f with itself.
 
[[File:Fōrmulæ - Higher-order functions 08.png]]
 
The next function is an ordinary one. It returns the values given as argument added with 3.
 
[[File:Fōrmulæ - Higher-order functions 09.png]]
 
In the next example, g is a dynamically created function.
 
[[File:Fōrmulæ - Higher-order functions 10.png]]
 
[[File:Fōrmulæ - Higher-order functions 11.png]]
 
Since the '''Apply twice''' function returns a function, it can be immediately invoked:
 
[[File:Fōrmulæ - Higher-order functions 12.png]]
 
[[File:Fōrmulæ - Higher-order functions 11.png]]
 
It can also take a pure symbol, in order to retrrieve a symbolic result:
 
[[File:Fōrmulæ - Higher-order functions 13.png]]
Fōrmulæ programs are not textual, visualization/edition of programs is done showing/manipulating structures but not text ([http://wiki.formulae.org/Editing_F%C5%8Drmul%C3%A6_expressions more info]). Moreover, there can be multiple visual representations of the same program. Even though it is possible to have textual representation &mdash;i.e. XML, JSON&mdash; they are intended for transportation effects more than visualization and edition.
 
[[File:Fōrmulæ - Higher-order functions 14.png]]
The option to show Fōrmulæ programs and their results is showing images. Unfortunately images cannot be uploaded in Rosetta Code.
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap">Eval := function(f, x)
return f(x);
end;
 
Eval(x -> x^3, 7);
# 343</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
import "fmt"
 
func func1(f func(string) string) string { return f("a string") }
func func2(s string) string { return "func2 called with " + s }
func main() { fmt.Println(func1(func2)) }</langsyntaxhighlight>
 
=={{header|Groovy}}==
As [[closures]]:
<langsyntaxhighlight lang="groovy">first = { func -> func() }
second = { println "second" }
 
first(second)</langsyntaxhighlight>
 
As functions:
<langsyntaxhighlight lang="groovy">def first(func) { func() }
def second() { println "second" }
 
first(this.&second)</langsyntaxhighlight>
 
=={{header|Haskell}}==
Line 1,478 ⟶ 1,662:
 
A function is just a value that wants arguments:
<langsyntaxhighlight lang="haskell">func1 f = f "a string"
func2 s = "func2 called with " ++ s
 
main = putStrLn $ func1 func2</langsyntaxhighlight>
Or, with an anonymous function:
<langsyntaxhighlight lang="haskell">func f = f 1 2
 
main = print $ func (\x y -> x+y)
-- output: 3</langsyntaxhighlight>
Note that <tt>func (\x y -> x+y)</tt> is equivalent to <tt>func (+)</tt>. (Operators are functions too.)
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight lang="icon"> procedure main()
local lst
lst := [10, 20, 30, 40]
Line 1,502 ⟶ 1,686:
procedure callback(arg)
write("->", arg)
end</langsyntaxhighlight>
 
=={{header|Inform 6}}==
As in C, functions in Inform 6 are not first-class, but pointers to functions can be used.
<langsyntaxhighlight Inform6lang="inform6">[ func;
print "Hello^";
];
Line 1,516 ⟶ 1,700:
[ Main;
call_func(func);
];</langsyntaxhighlight>
 
=={{header|Inform 7}}==
Phrases usually aren't defined with names, only with invocation syntax. A phrase must be given a name (here, "addition" and "multiplication") in order to be passed as a phrase value.
<langsyntaxhighlight lang="inform7">Higher Order Functions is a room.
 
To decide which number is (N - number) added to (M - number) (this is addition):
Line 1,534 ⟶ 1,718:
demonstrate addition as "Add";
demonstrate multiplication as "Mul";
end the story.</langsyntaxhighlight>
 
=={{Header|Insitux}}==
 
{{Trans|Clojure}}
 
<syntaxhighlight lang="insitux">
(function prepend-hello s
(str "Hello, " s))
 
(function modify-string f s
(f s))
 
(modify-string prepend-hello "World!")
</syntaxhighlight>
 
{{out}}
 
<pre>
Hello, World!
</pre>
 
=={{header|J}}==
Line 1,540 ⟶ 1,744:
''Adverbs'' take a single verb or noun argument and ''conjunctions'' take two. For example,<tt> / </tt>(insert)<tt> \ </tt>(prefix) and<tt> \. </tt>(suffix) are adverbs and <tt> @ </tt>(atop), <tt> & </tt>(bond or compose) and <tt> ^: </tt>(power) are conjunctions. The following expressions illustrate their workings.
 
<langsyntaxhighlight lang="j"> + / 3 1 4 1 5 9 NB. sum
23
>./ 3 1 4 1 5 9 NB. max
Line 1,570 ⟶ 1,774:
1 1.5 1.41667 1.41422 1.41421
f^:(i.5) 1x NB. rational approximations to sqrt 2
1 3r2 17r12 577r408 665857r470832</langsyntaxhighlight>
 
Adverbs and conjunctions may also be user defined
 
<langsyntaxhighlight Jlang="j"> + conjunction def 'u' -
+
+ conjunction def 'v' -
Line 1,581 ⟶ 1,785:
110
^ conjunction def '10 v 2 u y' * 11
20480</langsyntaxhighlight>
 
=={{header|Java}}==
Line 1,587 ⟶ 1,791:
There is no real callback in Java like in C or C++, but we can do the same as swing does for executing an event. We need to create an interface that has the method we want to call or create one that will call the method we want to call. The following example uses the second way.
 
<langsyntaxhighlight lang="java">public class NewClass {
public NewClass() {
Line 1,612 ⟶ 1,816:
interface AnEventOrCallback {
public void call();
}</langsyntaxhighlight>
 
From Java 8, lambda expressions may be used. Example (from Oracle):
<langsyntaxhighlight lang="java">public class ListenerTest {
public static void main(String[] args) {
JButton testButton = new JButton("Test Button");
Line 1,633 ⟶ 1,837:
frame.setVisible(true);
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
 
<langsyntaxhighlight lang="javascript">function first (func) {
return func();
}
Line 1,646 ⟶ 1,850:
 
var result = first(second);
result = first(function () { return "third"; });</langsyntaxhighlight>
 
An example with anonymous functions and uses in the core library
Line 1,652 ⟶ 1,856:
{{works with|Firefox|1.5}} for methods <code>filter</code> and <code>map</code>.
 
<langsyntaxhighlight lang="javascript">>>> var array = [2, 4, 5, 13, 18, 24, 34, 97];
>>> array
[2, 4, 5, 13, 18, 24, 34, 97]
Line 1,678 ⟶ 1,882:
// sort the array from largest to smallest
>>> array.sort(function (a, b) { return a < b });
[97, 34, 24, 18, 13, 5, 4, 2]</langsyntaxhighlight>
 
=={{header|Joy}}==
This example is taken from V.
Define first as multiplying two numbers on the stack.
<langsyntaxhighlight lang="joy">DEFINE first == *.</langsyntaxhighlight>
There will be a warning about overwriting builtin first.
Define second as interpreting the passed quotation on the stack.
<langsyntaxhighlight lang="joy">DEFINE second == i.</langsyntaxhighlight>
Pass first enclosed in quotes to second which applies it on the stack.
<syntaxhighlight lang ="joy">2 3 [first] second.</langsyntaxhighlight>
The program prints 6.
 
Line 1,701 ⟶ 1,905:
 
====Example 1: "hello blue world"====
<langsyntaxhighlight lang="jq">def foo( filter ):
("world" | filter) as $str
| "hello \($str)" ;
Line 1,709 ⟶ 1,913:
 
foo( blue ) # prints "hello blue world"
</syntaxhighlight>
</lang>
====Example 2: g(add; 2; 3)====
<syntaxhighlight lang="jq">
<lang jq>
def g(f; x; y): [x,y] | f;
 
g(add; 2; 3) # => 5</langsyntaxhighlight>
====Example: Built-in higher-order functions====
In the following sequence of interactions, we pass the function *is_even/0* to some built-in higher order functions. *is_even/0* is defined as follows:
<langsyntaxhighlight lang="jq">def is_even:
if floor == . then (. % 2) == 0
else error("is_even expects its input to be an integer")
end;</langsyntaxhighlight><syntaxhighlight lang ="jq">
# Are all integers between 1 and 5 even?
# For this example, we will use all/2 even
Line 1,746 ⟶ 1,950:
false
true
false</langsyntaxhighlight>
 
=={{header|Julia}}==
 
<syntaxhighlight lang="julia">
<lang Julia>
function foo(x)
str = x("world")
Line 1,756 ⟶ 1,960:
end
foo(y -> "blue $y") # prints "hello blue world"
</syntaxhighlight>
</lang>
 
The above code snippet defines a named function, <tt>foo</tt>, which takes a single argument, which is a <tt>Function</tt>.
Line 1,762 ⟶ 1,966:
In the final line, <tt>foo</tt> is called with an anonymous function that takes a string, and returns a that string with <tt>"blue "</tt> preppended to it.
 
<syntaxhighlight lang="julia">
<lang Julia>
function g(x,y,z)
x(y,z)
end
println(g(+,2,3)) # prints 5
</syntaxhighlight>
</lang>
 
This code snippet defines a named function <tt>g</tt> that takes three arguments: <tt>x</tt> is a function to call, and <tt>y</tt> and <tt>z</tt> are the values to call <tt>x</tt> on.
Line 1,773 ⟶ 1,977:
 
In the following interactive session, we pass the function iseven to a few higher order functions. The function iseven returns true if its argument is an even integer, false if it is an odd integer, and throws an error otherwise. The second argument to the functions is a range of integers, specifically the five integers between 1 and 5 included.
<langsyntaxhighlight lang="julia">julia> all(iseven, 1:5) # not all integers between 1 and 5 are even.
false
 
Line 1,794 ⟶ 1,998:
true
false
</syntaxhighlight>
</lang>
 
=={{header|Klingphix}}==
<langsyntaxhighlight Klingphixlang="klingphix">:+2 + 2 + ;
:*2 * 2 * ;
Line 1,805 ⟶ 2,009:
8 4 @*2 apply print nl
 
" " input</langsyntaxhighlight>
 
=={{header|Kotlin}}==
Kotlin is a functional language. Example showing how the builtin map function is used to get the average value of a transformed list of numbers:
<langsyntaxhighlight lang="scala">fun main(args: Array<String>) {
val list = listOf(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0)
val a = list.map({ x -> x + 2 }).average()
Line 1,815 ⟶ 2,019:
val g = list.map({ x -> x * x * x }).average()
println("A = %f G = %f H = %f".format(a, g, h))
}</langsyntaxhighlight>
 
Another example showing the syntactic sugar available to Kotlin developers which allows them to put the lambda expression out of the parenthesis whenever the function is the last argument of the higher order function. Notice the usage of the inline modifier, which inlines the bytecode of the argument function on the callsite, reducing the object creation overhead (an optimization for pre Java 8 JVM environments, like Android) (translation from Scala example):
<langsyntaxhighlight lang="scala">inline fun higherOrderFunction(x: Int, y: Int, function: (Int, Int) -> Int) = function(x, y)
 
fun main(args: Array<String>) {
val result = higherOrderFunction(3, 5) { x, y -> x + y }
println(result)
}</langsyntaxhighlight>
 
{{out}}
Line 1,829 ⟶ 2,033:
 
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
<lang Scheme>
{def add
{lambda {:f :g :x}
Line 1,842 ⟶ 2,046:
{S.reduce + {S.serie 1 10}}
-> 55
</syntaxhighlight>
</lang>
 
=={{header|Lily}}==
<langsyntaxhighlight lang="lily">define square(x: Integer): Integer
{
return x * x
Line 1,870 ⟶ 2,074:
 
# Calling user-defined transformation.
print(apply("123", String.parse_i)) # Some(123)</langsyntaxhighlight>
 
=={{header|Lingo}}==
Lingo doesn't support first-class functions. But functions can be passed as "symbols", and then be called via Lingo's 'call' command. Global functions - i.e. either built-in functions or user-defined functions in movie scripts - are always methods of the core '_movie' object, for other object functions (methods) also the object has to be specified. Here as example an implementation of a generic "map" function:
 
<langsyntaxhighlight lang="lingo">-- in some movie script
----------------------------------------
-- Runs provided function (of some object) on all elements of the provided list, returns results as new list
Line 1,891 ⟶ 2,095:
end repeat
return res
end</langsyntaxhighlight>
 
<langsyntaxhighlight lang="lingo">l = [1, 2, 3]
 
-- passes the built-in function 'sin' (which is a method of the _movie object) as argument to map
Line 1,899 ⟶ 2,103:
 
put res
-- [0.8415, 0.9093, 0.1411]</langsyntaxhighlight>
 
=={{header|Logo}}==
You can pass the quoted symbol for the function and invoke it with RUN.
<langsyntaxhighlight lang="logo">to printstuff
print "stuff
end
Line 1,910 ⟶ 2,114:
end
runstuff "printstuff ; stuff
runstuff [print [also stuff]] ; also stuff</langsyntaxhighlight>
 
=={{header|Lua}}==
Lua functions are first-class:
<langsyntaxhighlight lang="lua">a = function() return 1 end
b = function(r) print( r() ) end
b(a)</langsyntaxhighlight>
 
=={{header|Luck}}==
Higher-order functions can be used to implement conditional expressions:
<langsyntaxhighlight lang="luck">function lambda_true(x: 'a)(y: 'a): 'a = x;;
function lambda_false(x: 'a)(y: 'a): 'a = y;;
function lambda_if(c:'a -> 'a -> 'a )(t: 'a)(f: 'a): 'a = c(t)(f);;
 
print( lambda_if(lambda_true)("condition was true")("condition was false") );;</langsyntaxhighlight>
 
=={{header|M2000 Interpreter}}==
We can pass by reference a standard function, or we can pass by value a lambda function (also we can pass by reference as reference to lambda function)
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Function Foo (x) {
=x**2
Line 1,945 ⟶ 2,149:
Print Bar(&K.MulZ(), 20)=200
Print K.Z=11
</syntaxhighlight>
</lang>
 
Example using lambda function
 
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Foo = Lambda k=1 (x)-> {
k+=2
Line 1,977 ⟶ 2,181:
Print Bar2(&NewFoo, 20)=409
 
</syntaxhighlight>
</lang>
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
Passing 3 arguments and a value (could be a number, variable, graphic or a function as well, actually it could be ''anything''), and composing them in an unusual way:
<langsyntaxhighlight Mathematicalang="mathematica">PassFunc[f_, g_, h_, x_] := f[g[x]*h[x]]
PassFunc[Tan, Cos, Sin, x]
% /. x -> 0.12
PassFunc[Tan, Cos, Sin, 0.12]</langsyntaxhighlight>
gives back:
<langsyntaxhighlight Mathematicalang="mathematica">Tan[Cos[x] Sin[x]]
0.119414
0.119414</langsyntaxhighlight>
 
=={{header|MATLAB}} / {{header|Octave}}==
<langsyntaxhighlight MATLABlang="matlab"> F1=@sin; % F1 refers to function sin()
F2=@cos; % F2 refers to function cos()
 
Line 2,008 ⟶ 2,212:
F4 = 'cos';
feval(F3,pi/4)
feval(F4,pi/4)</langsyntaxhighlight>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">callee(n) := (print(sconcat("called with ", n)), n + 1)$
caller(f, n) := sum(f(i), i, 1, n)$
caller(callee, 3);
"called with 1"
"called with 2"
"called with 3"</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight lang="maxscript">fn second =
(
print "Second"
Line 2,029 ⟶ 2,233:
)
 
first second</langsyntaxhighlight>
 
=={{header|Metafont}}==
Line 2,035 ⟶ 2,239:
We can simulate this by using <code>scantokens</code>, which ''digests'' a string as if it would be a source input.
 
<langsyntaxhighlight lang="metafont">def calcit(expr v, s) = scantokens(s & decimal v) enddef;
 
t := calcit(100.4, "sind");
show t;
end</langsyntaxhighlight>
 
=={{header|МК-61/52}}==
<syntaxhighlight lang="text">6 ПП 04
П7 КПП7 В/О
1 В/О</langsyntaxhighlight>
 
''Note'': as the receiver of argument used register ''Р7''; the result is "1" on the indicator.
 
=={{header|Modula-3}}==
<langsyntaxhighlight lang="modula3">MODULE Proc EXPORTS Main;
 
IMPORT IO;
Line 2,067 ⟶ 2,271:
BEGIN
First(Second);
END Proc.</langsyntaxhighlight>
 
=={{header|Morfa}}==
{{trans|D}}
<langsyntaxhighlight lang="morfa">
func g(a: int, b: int, f: func(int,int): int): int
{
Line 2,084 ⟶ 2,288:
println("Multiply: ", g(2, 3, func(a: int, b: int) { return a * b; }));
}
</syntaxhighlight>
</lang>
 
=={{header|Nanoquery}}==
{{trans|Python}}
<langsyntaxhighlight lang="nanoquery">def first(function)
return function()
end
Line 2,097 ⟶ 2,301:
 
result = first(second)
println result</langsyntaxhighlight>
{{out}}
<pre>second</pre>
Line 2,103 ⟶ 2,307:
=={{header|Nemerle}}==
Functions must declare the types of their parameters in Nemerle. Function types in Nemerle are written ''params type'' -> ''return type'', as seen in the simple example below.
<langsyntaxhighlight Nemerlelang="nemerle">Twice[T] (f : T -> T, x : T) : T { f(f(x)) }</langsyntaxhighlight>
 
=={{header|NewLISP}}==
<langsyntaxhighlight NewLISPlang="newlisp">> (define (my-multiply a b) (* a b))
(lambda (a b) (* a b))
> (define (call-it f x y) (f x y))
Line 2,112 ⟶ 2,316:
> (call-it my-multiply 2 3)
6
</syntaxhighlight>
</lang>
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc first(fn: proc): auto =
return fn()
 
Line 2,121 ⟶ 2,325:
return "second"
 
echo first(second)</langsyntaxhighlight>
 
=={{header|Oberon-2}}==
Works with oo2c version 2
<langsyntaxhighlight lang="oberon2">
MODULE HOFuns;
IMPORT
Line 2,160 ⟶ 2,364:
PrintWords(words,Tools.AdjustRight)
END HOFuns.
</syntaxhighlight>
</lang>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
bundle Default {
class HighOrder {
Line 2,180 ⟶ 2,384:
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
 
A function is just a value that wants arguments:
<langsyntaxhighlight lang="ocaml"># let func1 f = f "a string";;
val func1 : (string -> 'a) -> 'a = <fun>
# let func2 s = "func2 called with " ^ s;;
Line 2,192 ⟶ 2,396:
# print_endline (func1 func2);;
func2 called with a string
- : unit = ()</langsyntaxhighlight>
 
Or, with an anonymous function:
<langsyntaxhighlight lang="ocaml"># let func f = f 1 2;;
val func : (int -> int -> 'a) -> 'a = <fun>
 
# Printf.printf "%d\n" (func (fun x y -> x + y));;
3
- : unit = ()</langsyntaxhighlight>
Note that <tt>func (fun x y -> x + y)</tt> is equivalent to <tt>func (+)</tt>. (Operators are functions too.)
 
Line 2,207 ⟶ 2,411:
We can pass a function handle (<code>@function_name</code>)
 
<langsyntaxhighlight lang="octave">function r = computeit(f, g, v)
r = f(g(v));
endfunction
 
computeit(@exp, @sin, pi/3)
computeit(@log, @cos, pi/6)</langsyntaxhighlight>
 
Or pass the string name of the function and use the <code>feval</code> primitive.
 
<langsyntaxhighlight lang="octave">function r = computeit2(f, g, v)
r = f(feval(g, v));
endfunction
 
computeit2(@exp, "sin", pi/3)</langsyntaxhighlight>
 
=={{header|Odin}}==
 
<syntaxhighlight lang="odin">package main
 
import "core:fmt"
 
first :: proc(fn: proc() -> string) -> string {
return fn()
}
 
second :: proc() -> string {
return "second"
}
 
main :: proc() {
fmt.println(first(second)) // prints: second
}</syntaxhighlight>
 
=={{header|Oforth}}==
Line 2,226 ⟶ 2,448:
If you add # before a function or method name you push the function object on the stack (instead of performing the function). This allows to pass functions to other functions, as for any other object.
Here we pass #1+ to map :
<langsyntaxhighlight Oforthlang="oforth">[1, 2, 3, 4, 5 ] map(#1+)</langsyntaxhighlight>
 
=={{header|Ol}}==
<langsyntaxhighlight lang="scheme">
; typical use:
(for-each display '(1 2 "ss" '(3 4) 8))
Line 2,239 ⟶ 2,461:
(do print 12345)
; ==> 12345
</syntaxhighlight>
</lang>
 
=={{header|ooRexx}}==
routines are first class ooRexx objects that can be passed to other routines or methods and invoked.
<langsyntaxhighlight ooRexxlang="oorexx">say callit(.routines~fib, 10)
say callit(.routines~fact, 6)
say callit(.routines~square, 13)
Line 2,298 ⟶ 2,520:
next = current
end
return current</langsyntaxhighlight>
{{out}}
<pre>55
Line 2,312 ⟶ 2,534:
Functions in Order can accept any other named function, local variable, or anonymous function as arguments:
 
<syntaxhighlight lang="c">
<lang C>
#include <order/interpreter.h>
 
Line 2,341 ⟶ 2,563:
)
// -> 16
</syntaxhighlight>
</lang>
 
The only difference between toplevel function definitions, and variables or literals, is that variables and anonymous functions must be called using the <code>8ap</code> syntactic form rather than direct argument application syntax. This is a limitation of the C preprocessor.
 
=={{header|OxygenBasic}}==
<langsyntaxhighlight lang="oxygenbasic">
'FUNCTION TO BE PASSED
'=====================
Line 2,375 ⟶ 2,597:
print g(@f#double#double) 'result '42'
 
</syntaxhighlight>
</lang>
 
=={{header|Oz}}==
Functions are just regular values in Oz.
<langsyntaxhighlight lang="oz">declare
fun {Twice Function X}
{Function {Function X}}
end
in
{Show {Twice Sqrt 81.0}} %% prints 3.0</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
{{works with|PARI/GP|2.4.2 and above}} <!-- requires closures -->
<langsyntaxhighlight lang="parigp">secant_root(ff,a,b)={
e = eps() * 2;
aval=ff(a);
Line 2,406 ⟶ 2,628:
precision(2. >> (32 * ceil(default(realprecision) * 38539962 / 371253907)), 9)
};
addhelp(eps,"Returns machine epsilon for the current precision.");</langsyntaxhighlight>
 
=={{header|Pascal}}==
Standard Pascal (will not work with Turbo Pascal):
<langsyntaxhighlight lang="pascal">program example(output);
 
function first(function f(x: real): real): real;
Line 2,424 ⟶ 2,646:
begin
writeln(first(second));
end.</langsyntaxhighlight>
 
[[Turbo Pascal]] (will not work with Standard Pascal):
 
<langsyntaxhighlight lang="pascal">program example;
 
type
Line 2,447 ⟶ 2,669:
begin
writeln(first(second));
end.</langsyntaxhighlight>
 
=== using FreePascal : Higher-order function MAP / REDUCE ( FOLDL / FOLDR ) / FILTER ===
{{works with|FreePascalFree Pascal|3.2.0 }}
<syntaxhighlight lang="pascal">
<lang Pascal>
UNIT MRF;
{$mode Delphi} {$H+} {$J-} {$R+} (*) https://www.freepascal.org/docs-html/prog/progch1.html (*)
Line 2,465 ⟶ 2,687:
It contains a text IDE called fp
 
https://www.freepascal.org/advantage.var
 
(*)
Line 3,173 ⟶ 3,396:
 
 
</langsyntaxhighlight>JPD 2021/07/10
 
Output:
Line 3,180 ⟶ 3,403:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">sub another {
# take a function and a value
my $func = shift;
Line 3,206 ⟶ 3,429:
);
 
print another $dispatch{$_}, 123 for qw(square cube rev);</langsyntaxhighlight>
 
<langsyntaxhighlight lang="perl">sub apply (&@) { # use & as the first item in a prototype to take bare blocks like map and grep
my ($sub, @ret) = @_; # this function applies a function that is expected to modify $_ to a list
$sub->() for @ret; # it allows for simple inline application of the s/// and tr/// constructs
Line 3,215 ⟶ 3,438:
 
print join ", " => apply {tr/aeiou/AEIOU/} qw/one two three four/;
# OnE, twO, thrEE, fOUr</langsyntaxhighlight>
 
<langsyntaxhighlight lang="perl">sub first {shift->()}
 
sub second {'second'}
Line 3,223 ⟶ 3,446:
print first \&second;
 
print first sub{'sub'};</langsyntaxhighlight>
 
=={{header|Phix}}==
{{libheader|Phix/basics}}
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">procedure</span> <span style="color: #000000;">use</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">fi</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">fi</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b</span><span style="color: #0000FF;">)</span>
Line 3,237 ⟶ 3,460:
<span style="color: #000000;">use</span><span style="color: #0000FF;">(</span><span style="color: #000000;">add</span><span style="color: #0000FF;">,</span><span style="color: #000000;">23</span><span style="color: #0000FF;">,</span><span style="color: #000000;">45</span><span style="color: #0000FF;">)</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 3,246 ⟶ 3,469:
The plain add, without a trailing '(' to make it a direct invocation, resolves to a symbol table index.<br>
Obviously you can use (an otherwise pointless) user defined type (of any name you like) instead of integer if preferred, eg
<!--<langsyntaxhighlight Phixlang="phix">-->
<span style="color: #008080;">type</span> <span style="color: #000000;">rid</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000080;font-style:italic;">/*r*/</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">type</span>
<span style="color: #008080;">procedure</span> <span style="color: #000000;">use</span><span style="color: #0000FF;">(</span><span style="color: #000000;">rid</span> <span style="color: #000000;">fi</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">,</span><span style="color: #000000;">b</span><span style="color: #0000FF;">)...</span>
<!--</langsyntaxhighlight>-->
 
=={{header|Phixmonti}}==
<langsyntaxhighlight Phixmontilang="phixmonti">def suma + enddef
 
def apply exec enddef
 
23 45 getid suma apply print
</syntaxhighlight>
</lang>
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php">function first($func) {
return $func();
}
Line 3,269 ⟶ 3,492:
}
 
$result = first('second');</langsyntaxhighlight>
Or, with an anonymous function in PHP 5.3+:
<langsyntaxhighlight lang="php">function first($func) {
return $func();
}
 
$result = first(function() { return 'second'; });</langsyntaxhighlight>
 
=={{header|Picat}}==
Here are some different approaches.
The following variables and functions are assumed to be defined:
<syntaxhighlight lang="picat">go =>
% ...
L = 1..10,
L2 = 1..3,
% ...
 
f1(X) = X**2.
f2(X,A) = X**A + A**X.
 
%
% qsort(List, SortFunction)
% returns a sorted list according to the sort function SortFunction
%
qsort([],_F) = [].
qsort([H|T],F) = qsort([E : E in T, call(F,E,H)], F)
++ [H] ++
qsort([E : E in T, not call(F,E,H)],F).
 
% sort on length
sortf(F1,F2) =>
F1.length < F2.length.</syntaxhighlight>
 
===Using map===
<syntaxhighlight lang="picat"> % ...
println(map(f1,L)),
println(map($f2(3),L)),
println(map(f2,L,map(f1,L))).</syntaxhighlight>
 
===List comprehension===
In general the recommended approach.
<syntaxhighlight lang="picat"> %
println([f1(I) : I in L]),
println([[I,J,f2(I,J)] : I in L, J in L2]).</syntaxhighlight>
===Apply===
<syntaxhighlight lang="picat"> % ...
println(apply(+,1,2)),
println(apply(f2,10,22)).</syntaxhighlight>
 
===Sort function===
Here is an example how to sort on length.
<syntaxhighlight lang="picat"> % ...
S = [
"rosetta code",
"adam",
"eve",
"picat",
"pattern-matching",
"imperative",
"constraints",
"actors",
"tabling"
],
println(map(len,S)),
println(S.qsort(sortf)).</syntaxhighlight>
 
{{out}}
<pre>[1,4,9,16,25,36,49,64,81,100]
[4,17,54,145,368,945,2530,7073,20412,60049]
[2,32,20412,4295032832,298023223886718750,10314424798490535548348731392,256923577521058878088611477224913844394456,6277101735386680763835789423207666416102355725939011223552,196627050475552913618075908526912116283103450944214766927315565632601688195930,10000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000]
[1,4,9,16,25,36,49,64,81,100]
[[1,1,2],[1,2,3],[1,3,4],[2,1,3],[2,2,8],[2,3,17],[3,1,4],[3,2,17],[3,3,54],[4,1,5],[4,2,32],[4,3,145],[5,1,6],[5,2,57],[5,3,368],[6,1,7],[6,2,100],[6,3,945],[7,1,8],[7,2,177],[7,3,2530],[8,1,9],[8,2,320],[8,3,7073],[9,1,10],[9,2,593],[9,3,20412],[10,1,11],[10,2,1124],[10,3,60049]]
3
10000000026559922791424
[12,4,3,5,16,10,11,6,7]
[eve,adam,picat,actors,tabling,imperative,constraints,rosetta code,pattern-matching]</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">: (de first (Fun)
(Fun) )
-> first
Line 3,310 ⟶ 3,603:
 
: (mapcar add (1 2 3) (4 5 6))
-> (5 7 9)</langsyntaxhighlight>
 
=={{header|PL/I}}==
<syntaxhighlight lang="pl/i">
<lang PL/I>
f: procedure (g) returns (float);
declare g entry (float);
Line 3,322 ⟶ 3,615:
 
x = f(p); /* where "p" is the name of a function. */
</syntaxhighlight>
</lang>
 
=={{header|Pop11}}==
<langsyntaxhighlight lang="pop11">;;; Define a function
define x_times_three_minus_1(x);
return(3*x-1);
Line 3,331 ⟶ 3,624:
 
;;; Pass it as argument to built-in function map and print the result
mapdata({0 1 2 3 4}, x_times_three_minus_1) =></langsyntaxhighlight>
 
=={{header|PostScript}}==
Postscript functions are either built-in operators or executable arrays (procedures). Both can take either as arguments.
<syntaxhighlight lang="text">
% operator example
% 'ifelse' is passed a boolean and two procedures
Line 3,346 ⟶ 3,639:
/bar { (Hello, world!) } def
/bar load foo ==
</syntaxhighlight>
</lang>
 
=={{header|PowerShell}}==
{{works with|PowerShell|4.0}}
<syntaxhighlight lang="powershell">
<lang PowerShell>
function f ($y) {
$y*$y
Line 3,357 ⟶ 3,650:
(f $y)
}
</syntaxhighlight>
</lang>
 
You can implement a function inside a function.
 
<syntaxhighlight lang="powershell">
<lang PowerShell>
function g2($y) {
function f2($y) {
Line 3,368 ⟶ 3,661:
(f2 $y)
}
</syntaxhighlight>
</lang>
<b>Calling:</b>
<syntaxhighlight lang="powershell">
<lang PowerShell>
g f 5
g2 9
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 3,381 ⟶ 3,674:
 
=={{header|Prolog}}==
<langsyntaxhighlight lang="prolog">
first(Predicate) :- call(Predicate).
second(Argument) :- write(Argument).
 
:-first(second('Hello World!')).
</syntaxhighlight>
</lang>
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Prototype.d func(*text$)
 
Procedure NumberTwo(arg$)
Line 3,400 ⟶ 3,693:
EndProcedure
 
NumberOne(@NumberTwo(),"Hello Worldy!")</langsyntaxhighlight>
 
=={{header|Python}}==
{{works with|Python|2.5}}
 
<langsyntaxhighlight lang="python">def first(function):
return function()
 
Line 3,411 ⟶ 3,704:
return "second"
 
result = first(second)</langsyntaxhighlight>
 
or
 
<langsyntaxhighlight lang="python"> result = first(lambda: "second")</langsyntaxhighlight>
 
Functions are first class objects in Python. They can be bound to names ("assigned" to "variables"), associated with keys in dictionaries, and passed around like any other object.
Line 3,423 ⟶ 3,716:
Its helpful to remember that in Q, when parameters aren't named in the function declaration, <tt>x</tt> is assumed to be the first parameter.
 
<syntaxhighlight lang="q">
<lang Q>
q)sayHi:{-1"Hello ",x;}
q)callFuncWithParam:{x["Peter"]}
Line 3,429 ⟶ 3,722:
Hello Peter
q)callFuncWithParam[sayHi]
Hello Peter</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
First define the higher order functions <code>fold</code>, <code>map</code>, and <code>filter</code>.
As a dialogue in the Quackery shell…
 
<pre>/O> [ sayover [] "Doing= theiff word:drop "done
... dup echo dip
[ behead swap
... do ] is task ( x --> )
' [ witheach ] ]
...
nested join do ] is fold ( [ x --> x )
 
[ ' [ [ ] ] rot join swap
Stack empty.
nested
' [ nested join ] join
fold ] is map ( [ x --> [ )
 
[ ' [ [ ] ] rot join swap
/O> 10 11 ' + task
nested ' dup swap join
' [ iff [ nested join ]
else drop ] join
fold ] is filter ( [ x --> [ )
 
</pre>
 
Then test them in the Quackery shell by summing a nest of numbers, recursively flattening a deeply nested nest, reversing every string in a nest of strings, and removing all the negative numbers from a nest of numbers.
 
For another example of usage of <code>map</code> and <code>filter</code>, see <code>countchars</code> in [[Huffman coding#Quackery]].
 
<pre>/O> ' [ 1 2 3 4 5 6 7 8 9 10 ] ' + fold echo
...
55
Doing the word: +
Stack: 21 empty.
 
/O> forward is flatten ( x --> [ )
/O> 2 ' * task
... [ ' [ [ ] ] swap join
... ' [ dup nest? if
... flatten
... join ]
... fold ] resolves flatten ( x --> [ )
...
Doing the word: *
Stack: 42
 
Stack empty.
/O> ' drop task
 
/O> ' [ 1 2 [ [ 3 4 ] ] 5 [ 6 [ 7 [ 8 [ 9 ] ] ] ] ] flatten
... echo
...
[ 1 2 3 4 5 6 7 8 9 ]
Stack empty.
 
/O> $ "esreveR yreve gnirts ni a tsen fo .sgnirts" nest$
... ' reverse map
... witheach [ echo$ sp ]
...
Reverse every string in a nest of strings.
Doing the word: drop
Stack empty.
 
</pre>
/O> ' [ 42 -23 23 -42 ]
... ' [ 0 < not ] filter
... echo
...
[ 42 23 ]
Stack empty.</pre>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">f <- function(f0) f0(pi) # calc. the function in pi
tf <- function(x) x^pi # a func. just to test
 
print(f(sin))
print(f(cos))
print(f(tf))</langsyntaxhighlight>
 
=={{header|Racket}}==
<syntaxhighlight lang="racket">
<lang Racket>
#lang racket/base
(define (add f g x)
(+ (f x) (g x)))
(add sin cos 10)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
Line 3,482 ⟶ 3,810:
either a bare block, or a parametrized block introduced with <tt>-></tt>, which serves as a "lambda":
 
<syntaxhighlight lang="raku" perl6line>sub twice(&todo) {
todo(); todo(); # declaring &todo also defines bare function
}
Line 3,498 ⟶ 3,826:
# output:
# 1: Hello!
# 2: Hello!</langsyntaxhighlight>
 
=={{header|Raven}}==
This is not strictly passing a function, but the string representing the function name.
<langsyntaxhighlight Ravenlang="raven">define doit use $v1
"doit called with " print $v1 print "\n" print
 
Line 3,509 ⟶ 3,837:
$v2 call
 
23.54 "doit" callit</langsyntaxhighlight>
{{out}}
<pre>callit called with doit
Line 3,516 ⟶ 3,844:
 
=={{header|REBOL}}==
<langsyntaxhighlight REBOLlang="rebol">REBOL [
Title: "Function Argument"
URL: http://rosettacode.org/wiki/Function_as_an_Argument
Line 3,545 ⟶ 3,873:
print ["Squared:" mold map :square x]
print ["Cubed: " mold map :cube x]
print ["Unnamed:" mold map func [i][i * 2 + 1] x]</langsyntaxhighlight>
 
Output:
Line 3,555 ⟶ 3,883:
 
=={{header|Retro}}==
<langsyntaxhighlight Retrolang="retro">:disp (nq-) call n:put ;
 
#31 [ (n-n) #100 * ] disp
</syntaxhighlight>
</lang>
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program demonstrates the passing of a name of a function to another function. */
call function 'fact' , 6; say right( 'fact{'$"} = ", 30) result
call function 'square' , 13; say right( 'square{'$"} = ", 30) result
Line 3,572 ⟶ 3,900:
function: arg ?.; parse arg ,$; signal value (?.)
reverse: return 'REVERSE'($)
square: return $**2</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
<pre>
Line 3,582 ⟶ 3,910:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
# Project : Higher-order functions
 
Line 3,601 ⟶ 3,929:
next
see nl
</syntaxhighlight>
</lang>
Output:
<pre>
Line 3,631 ⟶ 3,959:
=={{header|Ruby}}==
With a proc (procedure):
<langsyntaxhighlight lang="ruby">succ = proc{|x| x+1}
def to2(&f)
f[2]
Line 3,637 ⟶ 3,965:
 
to2(&succ) #=> 3
to2{|x| x+1} #=> 3</langsyntaxhighlight>
With a method:
<langsyntaxhighlight lang="ruby">def succ(n)
n+1
end
Line 3,648 ⟶ 3,976:
 
meth = method(:succ)
to2(meth) #=> 3</langsyntaxhighlight>
 
=={{header|Rust}}==
Functions are first class values and identified in the type system by implementing the FnOnce, FnMut or the Fn trait which happens implicitly for functions and closures.
<langsyntaxhighlight lang="rust">fn execute_with_10<F: Fn(u64) -> u64> (f: F) -> u64 {
f(10)
}
Line 3,663 ⟶ 3,991:
println!("{}", execute_with_10(|n| n*n )); // closure
println!("{}", execute_with_10(square)); // function
}</langsyntaxhighlight>
{{out}}
<pre>100
Line 3,669 ⟶ 3,997:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">def functionWithAFunctionArgument(x : int, y : int, f : (int, int) => int) = f(x,y)</langsyntaxhighlight>
Call:
<langsyntaxhighlight lang="scala">functionWithAFunctionArgument(3, 5, {(x, y) => x + y}) // returns 8</langsyntaxhighlight>
 
=={{header|Scheme}}==
 
A function is just a value that wants arguments:
<langsyntaxhighlight lang="scheme">> (define (func1 f) (f "a string"))
> (define (func2 s) (string-append "func2 called with " s))
> (begin (display (func1 func2)) (newline))
func2 called with a string</langsyntaxhighlight>
 
Or, with an anonymous function:
<langsyntaxhighlight lang="scheme">> (define (func f) (f 1 2))
> (begin (display (func (lambda (x y) (+ x y)))) (newline))
3</langsyntaxhighlight>
Note that <tt>(func (lambda (x y) (+ x y)))</tt> is equivalent to <tt>(func +)</tt>. (Operators are functions too.)
 
=={{header|SenseTalk}}==
<langsyntaxhighlight lang="sensetalk">function Map oldlist, func
put () into newlist
repeat with each item of oldlist
Line 3,694 ⟶ 4,022:
end repeat
return newlist
end Map</langsyntaxhighlight>
 
<langsyntaxhighlight lang="sensetalk">put ("tomato", "aubergine", "courgette") into fruits
put Map(fruits, Uppercase)
</syntaxhighlight>
</lang>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func first(f) {
return f();
}
Line 3,710 ⟶ 4,038:
 
say first(second); # => "second"
say first(func { "third" }); # => "third"</langsyntaxhighlight>
 
=={{header|Slate}}==
Methods and blocks can both be passed as arguments to functions (other methods and blocks):
<langsyntaxhighlight lang="slate">define: #function -> [| :x | x * 3 - 1].
#(1 1 2 3 5 8) collect: function.</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
 
<langsyntaxhighlight Smalltalklang="smalltalk">first := [ :f | f value ].
second := [ 'second' ].
Transcript show: (first value: second).</langsyntaxhighlight>
<langsyntaxhighlight Smalltalklang="smalltalk">function := [:x | x * 3 - 1].
#(1 1 2 3 5 8) collect: function.</langsyntaxhighlight>
 
=={{header|Sparkling}}==
<langsyntaxhighlight lang="sparkling">function call_me(func, arg) {
return func(arg);
}
 
let answer = call_me(function(x) { return 6 * x; }, 7);
print(answer);</langsyntaxhighlight>
 
=={{header|Standard ML}}==
 
<langsyntaxhighlight lang="sml">- fun func1 f = f "a string";
val func1 = fn : (string -> 'a) -> 'a
- fun func2 s = "func2 called with " ^ s;
Line 3,742 ⟶ 4,070:
- print (func1 func2 ^ "\n");
func2 called with a string
val it = () : unit</langsyntaxhighlight>
 
Or, with an anonymous function:
<langsyntaxhighlight lang="sml">- fun func f = f (1, 2);
val func = fn : (int * int -> 'a) -> 'a
 
- print (Int.toString (func (fn (x, y) => x + y)) ^ "\n");
3
val it = () : unit</langsyntaxhighlight>
Note that <tt>func (fn (x, y) => x + y)</tt> is equivalent to <tt>func op+</tt>. (Operators are functions too.)
 
=={{header|SuperCollider}}==
<langsyntaxhighlight SuperColliderlang="supercollider">f = { |x, y| x.(y) }; // a function that takes a function and calls it with an argument
f.({ |x| x + 1 }, 5); // returns 5</langsyntaxhighlight>
 
=={{header|Swift}}==
<langsyntaxhighlight lang="swift">func func1(f: String->String) -> String { return f("a string") }
func func2(s: String) -> String { return "func2 called with " + s }
println(func1(func2)) // prints "func2 called with a string"</langsyntaxhighlight>
 
Or, with an anonymous function:
<langsyntaxhighlight lang="swift">func func3<T>(f: (Int,Int)->T) -> T { return f(1, 2) }
println(func3 {(x, y) in x + y}) // prints "3"</langsyntaxhighlight>
Note that <tt>{(x, y) in x + y}</tt> can also be written as <tt>{$0 + $1}</tt> or just <tt>+</tt>.
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl"># this procedure executes its argument:
proc demo {function} {
$function
}
# for example:
demo bell</langsyntaxhighlight>
It is more common to pass not just a function, but a command fragment or entire script. When used with the built-in <tt>list</tt> command (which introduces a very useful degree of quoting) this makes for a very common set of techniques when doing advanced Tcl programming.
<langsyntaxhighlight lang="tcl"># This procedure executes its argument with an extra argument of "2"
proc demoFrag {fragment} {
{*}$fragment 2
Line 3,793 ⟶ 4,121:
demoScript {
parray tcl_platform
}</langsyntaxhighlight>
 
=={{header|TI-89 BASIC}}==
Line 3,801 ⟶ 4,129:
The function name passed cannot be that of a local function, because the local function <code>map</code> does not see the local variables of the enclosing function.
 
<langsyntaxhighlight lang="ti89b">Local map
Define map(f,l)=Func
Return seq(#f(l[i]),i,1,dim(l))
EndFunc
Disp map("sin", {0, π/6, π/4, π/3, π/2})</langsyntaxhighlight>
 
=={{header|Toka}}==
Toka allows obtaining a function pointer via the '''`''' (''backtick'') word. The pointers are passed on the stack, just like all other data.
 
<langsyntaxhighlight lang="toka">[ ." First\n" ] is first
[ invoke ] is second
` first second</langsyntaxhighlight>
 
=={{header|Trith}}==
Due to the homoiconic program representation and the [[concatenative]] nature of the language, higher-order functions are as simple as:
<langsyntaxhighlight lang="trith">: twice 2 times ;
: hello "Hello, world!" print ;
[hello] twice</langsyntaxhighlight>
 
=={{header|TXR}}==
Line 3,824 ⟶ 4,152:
<code>lambda</code> passed to <code>mapcar</code> with environment capture:
 
<langsyntaxhighlight lang="txr">@(bind a @(let ((counter 0))
(mapcar (lambda (x y) (list (inc counter) x y))
'(a b c) '(t r s))))
Line 3,831 ⟶ 4,159:
@ (rep)@a:@(last)@a@(end)
@ (end)
@(end)</langsyntaxhighlight>
 
<pre>1:a:t
Line 3,837 ⟶ 4,165:
3:c:s</pre>
 
=={{header|uBasic/4tH}}==
{{trans|BBC BASIC}}
<syntaxhighlight lang="text">' Test passing a function to a function:
Print FUNC(_FNtwo(_FNone, 10, 11))
End
' Function to be passed:
_FNone Param (2) : Return ((a@ + b@)^2)
 
' Function taking a function as an argument:
_FNtwo Param (3) : Return (FUNC(a@ (b@, c@)))</syntaxhighlight>
{{out}}
<pre>441
 
0 OK, 0:79</pre>
=={{header|Ursa}}==
{{trans|Python}}
Functions are first-class objects in Ursa.
<langsyntaxhighlight lang="ursa">def first (function f)
return (f)
end
Line 3,849 ⟶ 4,192:
 
out (first second) endl console
# "second" is output to the console</langsyntaxhighlight>
 
=={{header|Ursala}}==
Line 3,857 ⟶ 4,200:
equivalent to the given functon composed with itself.
 
<langsyntaxhighlight Ursalalang="ursala">(autocomposition "f") "x" = "f" "f" "x"</langsyntaxhighlight>
test program:
<langsyntaxhighlight Ursalalang="ursala">#import flo
#cast %e
 
example = autocomposition(sqrt) 16.0</langsyntaxhighlight>
output:
<pre>2.000000e+00</pre>
Line 3,868 ⟶ 4,211:
=={{header|V}}==
Define first as multiplying two numbers on stack
<syntaxhighlight lang ="v">[first *].</langsyntaxhighlight>
Define second as applying the passed quote on stack
<syntaxhighlight lang ="v">[second i].</langsyntaxhighlight>
Pass the first enclosed in quote to second which applies it on stack.
<syntaxhighlight lang ="v">2 3 [first] second</langsyntaxhighlight>
=6
 
=={{header|VBA}}==
Based on the Pascal solution
<langsyntaxhighlight lang="pascal">Sub HigherOrder()
Dim result As Single
result = first("second")
Line 3,887 ⟶ 4,230:
Function second(x As Single) As Single
second = x / 2
End Function</langsyntaxhighlight>
 
=={{header|Visual Basic .NET}}==
Line 3,901 ⟶ 4,244:
===Named methods===
{{trans|C#: Named methods}}
<langsyntaxhighlight lang="vbnet">' Delegate declaration is similar to C#.
Delegate Function Func2(a As Integer, b As Integer) As Integer
 
Line 3,939 ⟶ 4,282:
Console.WriteLine("f=Div, f({0}, {1}) = {2}", a, b, [Call](div, a, b))
End Sub
End Module</langsyntaxhighlight>
 
===Lambda expressions===
{{trans|C#: Lambda expressions}}
Lambda expressions in VB.NET are similar to those in C#, except they can also explicitly specify a return type and exist as standalone "anonymous delegates". An anonymous delegate is created when a lambda expression is assigned to an implicitly typed variable (in which case the variable receives the type of the anonymous delegate) or when the target type given by context (at compile-time) is MulticastDelegate, Delegate, or Object. Anonymous delegates are derived from MulticastDelegate and are implicitly convertible to all compatible delegate types. A formal definition of delegate compatibility can be found in the language specification.
<langsyntaxhighlight lang="vbnet">Module Program
' Uses the System generic delegate; see C# entry for details.
Function [Call](f As Func(Of Integer, Integer, Integer), a As Integer, b As Integer) As Integer
Line 3,972 ⟶ 4,315:
Console.WriteLine("f=Div, f({0}, {1}) = {2}", a, b, [Call](anon, a, b))
End Sub
End Module</langsyntaxhighlight>
 
=={{header|Visual Prolog}}==
 
<syntaxhighlight lang="prolog">
<lang Prolog>
domains
intFunction = (integer In) -> integer Out procedure (i).
Line 3,993 ⟶ 4,336:
write(dotwice(addone,2)),
succeed().
</syntaxhighlight>
</lang>
 
=={{header|Wren}}==
<langsyntaxhighlight ecmascriptlang="wren">var first = Fn.new { |f|
System.print("first function called")
f.call()
Line 4,003 ⟶ 4,346:
var second = Fn.new { System.print("second function called") }
 
first.call(second)</langsyntaxhighlight>
 
{{out}}
Line 4,010 ⟶ 4,353:
second function called
</pre>
 
=={{header|Z80 Assembly}}==
Higher-order functions are often used for IRQ handlers which don't have a lot of time to figure out what to do. (I'll admit this is a bit of a stretch since typically the function that receives the IRQ handler as a parameter just calls it and does nothing else.)
 
Typically, the IRQ handler will jump to RAM, and before the program is in a state where the IRQ conditions will be met (such as a video game during a level transition), the function will be passed (sometimes even by value!) to the IRQ handler. On the Game Boy and the ZX Spectrum, RSTs are in ROM and thus cannot be changed at runtime, so there's not much of a choice.
 
In fact, it is <b>mandatory</b> to pass the IRQ handler by value on the Game Boy if your game uses hardware sprites, as during direct memory access the CPU loses the ability to access the cartridge, including code execution! Therefore, the code that initiates direct memory access must be copied to RAM from the cartridge ROM and executed from RAM. Since interrupt vectors are in ROM, the vBlank interrupt vector will immediately jump to RAM. Interrupts are disabled immediately after powering on, so we've got all the time we need to copy the interrupt handler to RAM. Once we enable IRQs, the code we copied must remain there or else the game will crash.
 
<syntaxhighlight lang="z80">org &0040 ;Game Boy's vblank IRQ goes here.
;This is not part of the standard Z80 vector table - interrupts work differently on the Game Boy.
jp &ff80
 
;more code goes here
 
;during setup, we'll CALL SetupDMA before enabling the vblank IRQ.
 
 
SetupDMA:
ld bc,DMACopyEnd-DMACopy ;how many bytes to copy
ld hl,DMACopy ;pointer to source
ld de,&ff80 ;pointer to destination
z_ldir ;macro for LDIR which the game boy doesn't have.
ret
 
DMACopy: ;must be run from &ff80
push af
ld a,>GBSpriteCache ;high byte of wherever we're storing our object attribute memory
gb_out <dma ;start the transfer - DMA auto-copies 256 bytes from xx00-xxFF where xx = >GBSpriteCache
ld a,&28 ;delay - this ensures the DMA is done before we exit. Adjust to your liking.
 
;game boy doesn't have in/out commands, rather all its I/O ports are at &FFxx so there are special commands just for accessing them faster
;gb_out is a macro that inlines the bytecode, since not all assemblers auto-convert LD (&FFxx),a.
 
DMACopyWait:
dec a
jr nz,DMACopyWait
pop af
reti
DMACopyEnd:</syntaxhighlight>
 
 
 
 
=={{header|zkl}}==
Everything is a first class object so
<langsyntaxhighlight lang="zkl">fcn f(g){ g() } fcn g{ "Hello World!".println() }</langsyntaxhighlight>
{{out}}
<pre>
Line 4,021 ⟶ 4,405:
</pre>
or
<langsyntaxhighlight lang="zkl">fcn f(g){ g() }
fcn(g){ g() }(fcn{ "Hello World!".println() } )</langsyntaxhighlight>
 
=={{header|ZX Spectrum Basic}}==
{{trans|BBC_BASIC}}
Input "FN " token first, then enclose it in double quotation marks.
<langsyntaxhighlight lang="zxbasic">10 DEF FN f(f$,x,y)=VAL ("FN "+f$+"("+STR$ (x)+","+STR$ (y)+")")
20 DEF FN n(x,y)=(x+y)^2
30 PRINT FN f("n",10,11)</langsyntaxhighlight>
 
{{omit from|GUISS}}
2,120

edits