Function definition

Revision as of 07:45, 25 June 2022 by rosettacode>Roboticist-Tav (→‎{{header|Diego}}: added Diego entry)

A function is a body of code that returns a value.

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

The value returned may depend on arguments provided to the function.


Task

Write a definition of a function called "multiply" that takes two arguments and returns their product.

(Argument types should be chosen so as not to distract from showing how functions are created and values returned).


Related task



11l

Function definition: <lang 11l>F multiply(a, b)

  R a * b</lang>

Lambda function definition: <lang 11l>V multiply = (a, b) -> a * b</lang>

360 Assembly

Linkage conventions are: register 1 : the parameter list, register 0 : the return value, and register 14 : the return address. <lang 360asm>DEFFUN CSECT

        USING  DEFFUN,R13

SAVEAREA B PROLOG-SAVEAREA(R15)

        DC     17F'0'

PROLOG STM R14,R12,12(R13)

        ST     R13,4(R15)
        ST     R15,8(R13)
        LR     R13,R15            set base register

BEGIN L R2,=F'13'

        ST     R2,X               X=13
        L      R2,=F'17'
        ST     R2,Y               Y=17
        LA     R1,PARMLIST        R1->PARMLIST
        B      SKIPPARM

PARMLIST DS 0F

        DC     A(X)
        DC     A(Y)

SKIPPARM BAL R14,MULTPLIC call MULTPLIC

        ST     R0,Z               Z=MULTPLIC(X,Y)

RETURN L R13,4(0,R13) epilog

        LM     R14,R12,12(R13)
        XR     R15,R15            set return code
        BR     R14                return to caller

MULTPLIC EQU * function MULTPLIC(X,Y)

        L      R2,0(R1)           R2=(A(X),A(Y))
        XR     R4,R4              R4=0     
        L      R5,0(R2)           R5=X    
        L      R6,4(R2)           R6=Y    
        MR     R4,R6              R4R5=R4R5*R6
        LR     R0,R5              R0=X*Y   (R0 return value)
        BR     R14                end function MULTPLIC

X DS F Y DS F Z DS F

        YREGS  
        END    DEFFUN</lang>

6502 Assembly

As with other low-level languages, 6502 assembler has subroutines rather than functions in the strict sense. This implementation of MULTIPLY behaves rather like a function, however: it expects two 'parameters' to be passed in the index registers X and Y and it returns the answer in the accumulator. Note that the 6502 has no MUL instruction, so multiplication is carried out by repeated addition. <lang asm6502>MULTIPLY: STX MULN  ; 6502 has no "acc += xreg" instruction,

         TXA             ; so use a memory address

MULLOOP: DEY

         CLC             ; remember to clear the carry flag before
         ADC   MULN      ; doing addition or subtraction
         CPY   #$01
         BNE   MULLOOP
         RTS</lang>

An alternative implementation that multiplies A by X and checks if A/X is zero. <lang asm6502>; https://skilldrick.github.io/easy6502/

Multiplies A by X

define memory 1040

         JMP MAIN

MULTIPLY: STA memory  ; memory = A

         BEQ MUL_END  ; A = 0
         TXA          ; A = X
         BEQ MUL_END  ; X = 0 -> A = 0
         LDA memory
         CLC

MUL_LOOP: DEX  ; X -= 1

         BEQ MUL_END  ; X = 0 -> A = A * X
         ADC memory   ; A += memory
         JMP MUL_LOOP

MUL_END: RTS

MAIN: LDA #50

         LDX #5
         JSR MULTIPLY</lang>

68000 Assembly

What values are returned (if any) and where they are returned, will depend on the calling convention used. Code written by a C compiler will typically pass parameters onto the stack and use a "frame pointer" to reference them. For this simple example, the operands will be passed into the function using the registers D0 and D1, and the output will be in D0. A function is called by using JSR foo where foo is a labeled section of code or a 24-bit memory address. Execution will continue along starting at that address, until an RTS is encountered, at which point the return address will be popped off the stack into the program counter.

<lang 68000devpac>MOVE.L D0,#$0200 MOVE.L D1,#$0400

JSR doMultiply

rest of program

JMP $ ;halt

somewhere far away from the code above

doMultiply: MULU D0,D1 RTS </lang>


8051 Assembly

Like other assembly languages, 8051 doesn't have functions but instead has symbolic references to code. Function arguments are passed via registers decided on beforehand. <lang asm>ORG RESET mov a, #100 mov b, #10 call multiply

at this point, the result of 100*10 = 1000 = 03e8h is stored in registers a and b
a = e8
b = 03

jmp $

multiply: mul ab ret</lang>

8086 Assembly

A function is nothing more than a named section of code. A CALL instruction will push the current value of the instruction pointer and then set the instruction pointer to that address. Execution will continue forward until a RET statement is encountered, at which point the top of the stack is popped into the instruction pointer register. Note that the RET statement assumes that the top of the stack contains the actual return address, even though in reality this may not be the case. There is no validation that the return address is correct! This is why it's important for the assembly programmer to ensure the stack is balanced at all times, otherwise your program will go running off to who knows where.

It's important to remember that, unlike other languages, execution of assembly code (and this is true for all assembly languages, not just the 8086) is on a purely linear path by default, much like in other "primitive" languages like BASIC, and so there is nothing stopping the instruction pointer from "falling into" subroutines. Often this can be handy if you're trying to code a variation on a function whose only difference is doing a few extra things at the beginning, but it's something you'll need to guard against, either with a return to the operating system or an infinite loop.

<lang asm>start: mov al, 0x04 mov bl, 0x05 call multiply

at this point in execution, the AX register contains 0x0900.
more code goes here, ideally with some sort of guard against "fallthrough" into multiply.
somewhere far away from start

multiply: mul bl ;outputs 0x0014 to ax ret</lang>

AArch64 Assembly

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

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

/*******************************************/ /* Constantes file */ /*******************************************/ /* for this file see task include a file in language AArch64 assembly*/ .include "../includeConstantesARM64.inc"

/***********************/ /* Initialized data */ /***********************/ .data szRetourLigne: .asciz "\n" szMessResult: .asciz "Resultat : @ \n" // message result /*********************** /* No Initialized data */ /***********************/ .bss sZoneConv: .skip 24 .text .global main main:

                               // function multiply
   mov x0,8
   mov x1,50
   bl multiply                 // call function
   ldr x1,qAdrsZoneConv
   bl conversion10S            // call function with 2 parameter (x0,x1)
   ldr x0,qAdrszMessResult
   ldr x1,qAdrsZoneConv
   bl strInsertAtCharInc       // insert result at @ character
   bl affichageMess            // display message

   mov x0,0                    // return code

100: // end of program

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

qAdrsZoneConv: .quad sZoneConv qAdrszMessResult: .quad szMessResult /******************************************************************/ /* Function multiply */ /******************************************************************/ /* x0 contains value 1 */ /* x1 contains value 2 */ /* x0 return résult */ multiply:

   mul x0,x1,x0
   ret               // return function

/********************************************************/ /* File Include fonctions */ /********************************************************/ /* for this file see task include a file in language AArch64 assembly */ .include "../includeARM64.inc" </lang>

ACL2

<lang Lisp>(defun multiply (a b) (* a b))</lang>

ActionScript

<lang actionscript>function multiply(a:Number, b:Number):Number {

   return a * b;

}</lang>

Ada

<lang ada>function Multiply (A, B : Float) return Float;</lang> and an implementation of: <lang ada>function Multiply (A, B : Float) return Float is begin

  return A * B;

end Multiply;</lang>


The Ada 2012 standard provides an even simpler way to define and implement functions:

<lang Ada>function Multiply(A, B: Float) return Float is (A * B);</lang>


Ada supports generic functions which can take generic formal parameters like the numeric type to use: <lang ada>generic

  type Number is digits <>;

function Multiply (A, B : Number) return Number;</lang> implemented as: <lang ada>function Multiply (A, B : Number) return Number is begin

  return A * B;

end Multiply;</lang> To use this, you need to instantiate the function for each type e.g. <lang ada> with Multiply; ... function Multiply_Integer is new Multiply(Number => Integer); use Multiply_Integer; -- If you must

type My_Integer is Range -100..100; function Multiply_My_Integer is new Multiply(My_Integer); </lang>

Aime

<lang aime>real multiply(real a, real b) {

   return a * b;

}</lang>

ALGOL 60

begin
    comment Function definition;
    
    integer procedure multiply(a,b);
    integer a,b;
    begin
        multiply:=a*b;
    end;
    
    integer c;
    c:=multiply(2,2);
    outinteger(1,c)
end
Output:
 4

ALGOL 68

<lang algol68>PROC multiply = ( LONG REAL a, b ) LONG REAL: (

 a * b

)</lang>

ALGOL W

<lang algolw>long real procedure multiply( long real value a, b ); begin

   a * b

end</lang>

ALGOL-M

This implementation takes two integers and returns an integer. Note that a function is distinguished from a procedure, which does not return a value. <lang algol>INTEGER FUNCTION MULTIPLY( A, B ); INTEGER A, B; BEGIN

   MULTIPLY := A * B;

END;</lang>

AmigaE

<lang amigae>PROC my_molt(a,b) -> other statements if needed... here they are not ENDPROC a*b -> return value

-> or simplier

PROC molt(a,b) IS a*b

PROC main()

 WriteF('\d\n', my_molt(10,20))

ENDPROC</lang>

AntLang

<lang AntLang>multiply: * /`*' is a normal function multiply: {x * y}</lang> Explicit definition has the syntax: <lang AntLang>{expr-or-def1; expr-or-def2; ..; return-expr}</lang> Inside functions, the variable args contains the sequence of arguments. x, y and z contain the first, second and third argument.

APL

Works with: GNU_APL

<lang apl> ⍝⍝ APL2 'tradfn' (traditional function) ⍝⍝ This syntax works in all dialects including GNU APL and Dyalog. ∇ product ← a multiply b

 product ← a × b

     ⍝⍝ A 'dfn' or 'lambda' (anonymous function)
     multiply ← {⍺×⍵}

</lang>

Works with: Dyalog_APL

<lang apl>

     ⍝⍝ Dyalog dfn (lambda) syntax
     multiply  ←  ×

</lang> Works on arrays of any rank (any number of dimensions): atoms, lists, tables, etc.

AppleScript

<lang AppleScript>to multiply(a as number, b as number)

   return a * b

end</lang>

A function in AppleScript is called a "handler". It can take one of three different forms, depending on what the scripter finds most convenient. Calls to it must match the form used in the handler definition. The above is an example of a handler with "positional" parameters. Either to or on may be used as the first word in the header line. When the script's compiled, the handler label is automatically appended to the end line too if it wasn't written in.

<lang applescript>on multiply(a, b)

   return a * b

end multiply

multiply(2, 3)</lang>

AppleScript also offers handlers with "labeled" [sic] parameters. These aren't used much now as the limited choice of label enums makes it difficult to choose ones that make sense in English, although it's just about possible here:

<lang applescript>on multiplication of a by b

   return a * b

end multiplication

multiplication of 2 by 3 -- Or: (multiplication by 3) of 2, or: 2's (multiplication by 3)</lang>

Labeled parameters don't need to be in the same order in the calls as in the handler definition, but of, if used, is regarded as a direct parameter and requires some parenthesis if it's not given first or if the context isn't entirely clear.

For the past few years, handlers with "interleaved" parameters have also been possible. They're a development from AppleScriptObjectiveC and coders can specify their own labels provided these aren't reserved words. Calls to these handlers must reference the handlers' "owners", which are usually represented within the same script by the keyword my. The parameter order is the same in the calls as in the handler definitions:

<lang applescript>on multiply:a |by|:b -- 'by' is "barred" here because otherwise it's a reserved word.

   return a * b

end multiply:|by|:

my multiply:2 |by|:3</lang>

Applesoft BASIC

Applesoft BASIC functions are unary meaning they only take one argument. As the task asks for a multiply function which takes two arguments this poses a problem. To get around this, the multiply function MU takes one argument as the offset into an array of parameters.

Function names in Applesoft BASIC can be longer than two characters but only the first two characters are significant. Function names cannot contain any keywords.

<lang basic>10 DEF FN MULTIPLY(P) = P(P) * P(P+1) 20 P(1) = 611 : P(2) = 78 : PRINT FN MULTIPLY(1)</lang>

<lang basic>47658</lang>

Argile

<lang Argile>use std .: multiply <real a, real b> :. -> real {a * b}</lang> with a macro and a variable number of parameters: <lang Argile>use std =: multiply <real a> [<real b>...] := -> real {Cgen a (@@1 (Cgen " * " b))}</lang>

ARM Assembly

Works with: as version Raspberry Pi

<lang ARM Assembly> /* ARM assembly Raspberry PI */ /* program functMul.s */ /* Constantes */ .equ STDOUT, 1 .equ WRITE, 4 .equ EXIT, 1

/***********************/ /* Initialized data */ /***********************/ .data szRetourLigne: .asciz "\n" szMessResult: .ascii "Resultat : " @ message result sMessValeur: .fill 12, 1, ' '

                  .asciz "\n"

/*********************** /* No Initialized data */ /***********************/ .bss

.text .global main main:

   push {fp,lr}    /* save  2 registers */
   @ function multiply

mov r0,#8 mov r1,#50 bl multiply @ call function

   ldr r1,iAdrsMessValeur                
   bl conversion10S       @ call function with 2 parameter (r0,r1)
   ldr r0,iAdrszMessResult
   bl affichageMess            @ display message
   mov r0, #0                  @ return code

100: /* end of program */

   mov r7, #EXIT              @ request to exit program
   swi 0                       @ perform the system call

iAdrsMessValeur: .int sMessValeur iAdrszMessResult: .int szMessResult /******************************************************************/ /* Function multiply */ /******************************************************************/ /* r0 contains value 1 */ /* r1 contains value 2 */ /* r0 return résult */ multiply:

   mul r0,r1,r0
   bx lr	        /* return function */	

/******************************************************************/ /* display text with size calculation */ /******************************************************************/ /* r0 contains the address of the message */ affichageMess:

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

1: /* loop length calculation */

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


/***************************************************/ /* conversion register in string décimal signed */ /***************************************************/ /* r0 contains the register */ /* r1 contains address of conversion area */ conversion10S:

   push {fp,lr}    /* save registers frame and return */
   push {r0-r5}   /* save other registers  */
   mov r2,r1       /* early storage area */
   mov r5,#'+'     /* default sign is + */
   cmp r0,#0       /* négatif number ? */
   movlt r5,#'-'     /* yes sign is - */
   mvnlt r0,r0       /* and inverse in positive value */
   addlt r0,#1
   mov r4,#10   /* area length */

1: /* conversion loop */

   bl divisionpar10 /* division  */
   add r1,#48        /* add 48 at remainder for conversion ascii */	
   strb r1,[r2,r4]  /* store byte area r5 + position r4 */
   sub r4,r4,#1      /* previous position */
   cmp r0,#0     
   bne 1b	       /* loop if quotient not equal zéro */
   strb r5,[r2,r4]  /* store sign at current position  */
   subs r4,r4,#1   /* previous position */
   blt  100f         /* if r4 < 0  end  */
   /* else complete area with space */
   mov r3,#' '   /* character space */	

2:

   strb r3,[r2,r4]  /* store  byte  */
   subs r4,r4,#1   /* previous position */
   bge 2b        /* loop if r4 greather or equal zero */

100: /* standard end of function */

   pop {r0-r5}   /*restaur others registers */
   pop {fp,lr}   /* restaur des  2 registers frame et return  */
   bx lr   


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

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

.Ls_magic_number_10: .word 0x66666667


</lang>

ArnoldC

<lang arnoldc>LISTEN TO ME VERY CAREFULLY multiply I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE a I NEED YOUR CLOTHES YOUR BOOTS AND YOUR MOTORCYCLE b GIVE THESE PEOPLE AIR HEY CHRISTMAS TREE product YOU SET US UP @I LIED GET TO THE CHOPPER product HERE IS MY INVITATION a YOU'RE FIRED b ENOUGH TALK I'LL BE BACK product HASTA LA VISTA, BABY</lang>

Arturo

<lang arturo>multiply: $[x,y][x*y]

print multiply 3 7

multiply2: function [x,y][ return x*y ]

print multiply2 3 7 </lang>

Output:
21
21

AutoHotkey

<lang autohotkey>MsgBox % multiply(10,2)

multiply(multiplicand, multiplier) {

 Return (multiplicand * multiplier)

}</lang>

AutoIt

<lang AutoIt>#AutoIt Version: 3.2.10.0 $I=11 $J=12 MsgBox(0,"Multiply", $I &" * "& $J &" = " & product($I,$J)) Func product($a,$b)

  Return $a * $b

EndFunc</lang>

AWK

<lang awk>function multiply(a, b) {

 return a*b

} BEGIN {

 print multiply(5, 6)

}</lang>

Axe

<lang axe>Lbl MULT r₁*r₂ Return</lang>

BASIC

Works with: QBasic

<lang qbasic>DECLARE FUNCTION multiply% (a AS INTEGER, b AS INTEGER)

FUNCTION multiply% (a AS INTEGER, b AS INTEGER)

   multiply = a * b

END FUNCTION</lang>

BASIC256

<lang freebasic>function multiply(a, b)

   return a * b

end function</lang>

Commodore BASIC

In Commodore BASIC function definition can consist of any mathematical operation other functions or commands which result in a numeric expression. The definition is limited to single statement, and it accepts only a single argument. When using the function, keyword fn must precede the function name, which itself must be uniquely distinguishable by its first two characters. <lang basic>10 DEF FN MULT(X) = X*Y 20 Y = 4 : REM VALUE OF SECOND ARGUMENT MUST BE ASSIGNED SEPARATELY 30 PRINT FN MULT(3)</lang>

IS-BASIC

<lang IS-BASIC>100 DEF MULTIPLY(A,B)=A*B</lang>

GWBASIC

Works with: BASICA

<lang BASIC>10 DEF FNMULT(X,Y)=X*Y 20 PRINT FNMULT(5,6) 39 END </lang>

OxygenBasic

<lang> 'SHORT FORMS: float multiply(float a,b) = a * b float multiply(float a,b) { return a * b}

'BASIC FORM: function multiply(float a, float b) as float

 return a * b

end function

'BASIC LEGACY FORM: function multiply(byval a as float, byval b as float) as float

 function = a * b

end function

'TEST: print multiply(pi,2) '6.28... </lang>

QBasic

<lang qbasic>'This function could either be used for all numeric types '(as they are implicitly convertible to Double) FUNCTION multiply# (a AS DOUBLE, b AS DOUBLE)

   multiply = a * b

END FUNCTION ' ' Alternatively, it can be expressed in abbreviated form : ' DEF FNmultiply# (a AS DOUBLE, b AS DOUBLE) = a * b

PRINT multiply(3, 1.23456) PRINT FNmultiply#(3, 1.23456)</lang>

Output:
 3.703680038452148

True BASIC

The FUNCTION and DEF commands are synonymous and can be interchanged. <lang qbasic>FUNCTION multiply(a, b)

   LET multiply = a * b

END FUNCTION ! ! Alternatively, it can be expressed in abbreviated form : ! DEF multiply (a, b) = a * b

END</lang>

uBasic/4tH

<lang>Print FUNC(_multiply (23, 65)) End

_multiply Param (2) : Return (a@ * b@)</lang>

Yabasic

<lang yabasic>sub multiply(a, b)

   return a * b

end sub</lang>

Batch File

Windows batch files only have procedures, not functions. Instead, environmental variables can be used as a global shared state. <lang>@ECHO OFF SET /A result = 0 CALL :multiply 2 3 ECHO %result% GOTO :eof

multiply
   SET /A result = %1 * %2
   GOTO :eof
eof</lang>

BBC BASIC

BBC BASIC supports both single-line and multi-line function definitions. Note that the function name must begin with FN.

Single-line function: <lang bbcbasic>PRINT FNmultiply(6,7) END

DEF FNmultiply(a,b) = a * b</lang> Multiline function: <lang bbcbasic>DEF FNmultiply(a,b) LOCAL c c = a * b = c</lang>

bc

Works with: GNU bc

<lang bc>define multiply(a, b) { return a*b }

print multiply(2, 3)</lang>

BCPL

A function is simply defined as an expression in terms of its arguments. <lang bcpl>let multiply(a, b) = a * b</lang>

Defining a block of code that executes some statements and then returns a result, is done with a separate valof construct, which can appear wherever an expression may appear, but which is mostly used to define a function containing imperative statements. When used this way, it is equivalent to the functions in most other imperative languages. <lang bcpl>let multiply(a, b) = valof $( // any imperative statements could go here

  resultis a * b

$)</lang>

BlitzMax

<lang blitzmax>function multiply:float( a:float, b:float )

   return a*b

end function

print multiply(3.1416, 1.6180)</lang>

Output:
5.08310890

Boo

<lang boo>def multiply(x as int, y as int):

   return x * y

print multiply(3, 2)</lang>

BQN

Tacit definition: <lang bqn>Multiply ← ×</lang>

With names: <lang bqn>Multiply ← {𝕨×𝕩}</lang>

Bracmat

<lang bracmat>multiply=a b.!arg:(?a.?b)&!a*!b; out$multiply$(123456789.987654321); { writes 121932631112635269 to standard output }</lang>

Brat

<lang brat>multiply = { x, y | x * y }

p multiply 3 14 #Prints 42</lang>

C

<lang c>double multiply(double a, double b) {

  return a * b;

}</lang>

Macros

Macros can be defined at the top of a program and the compiler will replace the function calls with the function itself before compiling the program (the source file will not change). <lang c>#define MULTIPLY(X, Y) ((X) * (Y))</lang> Parentheses should be added around parameters in the function definition to avoid order of operations errors when someone uses the macro as such: <lang c>x = MULTIPLY(x + z, y);</lang> A program with that call would be compiled as if this were coded instead: <lang c>x = ((x + z) * (y));</lang> Another advantage of macros is that they work with all types alike. For example, the above macro can be used both to multiply double values (like the function above), and to multiply int values (giving an int, which the function doesn't).

C#

<lang csharp>static double multiply(double a, double b) {

   return a * b;

}</lang> Anonymous function: <lang csharp>Func<double, double, double> multiply = ((a,b) => a*b);</lang>

C++

C++ functions basically are the same as in C. Also macros exist, however they are discouraged in C++ in favour of inline functions and function templates.

An inline function differs from the normal function by the keyword inline and the fact that it has to be included in every translation unit which uses it (i.e. it normally is written directly in the header). It allows the compiler to eliminate the function without having the disadvantages of macros (like unintended double evaluation and not respecting scope), because the substitution doesn't happen at source level, but during compilation. An inline version of the above function is: <lang cpp>inline double multiply(double a, double b) {

  return a*b;

}</lang> If not only doubles, but numbers of arbitrary types are to be multiplied, a function template can be used: <lang cpp>template<typename Number>

 Number multiply(Number a, Number b)

{

  return a*b;

}</lang> Of course, both inline and template may be combined (the inline then has to follow the template<...>), but since templates have to be in the header anyway (while the standard allows them to be compiled separately using the keyword export, almost no compiler implements that), the compiler usually can inline the template even without the keyword.

Since C++20, the template parameters can be inferred using auto: <lang cpp>auto multiply(auto a, auto b) {

  return a*b;

}</lang>

ChucK

<lang> fun float multiply (float a, float b) {

   return a * b;

} // uncomment next line and change values to test //<<< multiply(16,4) >>>; </lang>

Clay

<lang Clay>multiply(x,y) = x * y;</lang>

Clojure

<lang lisp>(defn multiply [x y]

 (* x y))

(multiply 4 5)</lang> Or with multiple arities (in the manner of the actual * function): <lang lisp>(defn multiply

 ([] 1)
 ([x] x)
 ([x y] (* x y))
 ([x y & more] 
   (reduce * (* x y) more)))

(multiply 2 3 4 5)  ; 120</lang>

CLU

The following is a function that multiplies two integers and ignores any error conditions (as most examples do). <lang clu>multiply = proc (a, b: int) returns (int)

   return(a * b)

end multiply</lang>

The following is a type-parameterized function that wraps the built-in multiplication operator faithfully, rethrows any exceptions, and works for any type that supports multiplication. It also shows the complete syntax of a function definition (type parameterization, signals, and a where clause). <lang clu>multiply = proc [T: type] (a, b: T) returns (T)

          signals (overflow, underflow)
          where T has mul: proctype (T, T) returns (T)
                           signals (overflow, underflow)
   return(a * b) resignal overflow, underflow

end multiply</lang>

COBOL

In COBOL, multiply is a reserved word, so the requirements must be relaxed to allow a different function name. The following uses a program:

Works with: OpenCOBOL

<lang COBOL> IDENTIFICATION DIVISION.

      PROGRAM-ID. myTest.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01  x   PIC 9(3) VALUE 3.
      01  y   PIC 9(3) VALUE 2.
      01  z   PIC 9(9).
      PROCEDURE DIVISION.
          CALL "myMultiply" USING 
              BY CONTENT x, BY CONTENT y, 
              BY REFERENCE z.
          DISPLAY z.
          STOP RUN.
      END PROGRAM myTest.
      IDENTIFICATION DIVISION.
      PROGRAM-ID. myMultiply.
      DATA DIVISION.
      LINKAGE SECTION.
      01  x   PIC 9(3).
      01  y   PIC 9(3).
      01  z   PIC 9(9).
      PROCEDURE DIVISION USING x, y, z.
          MULTIPLY x BY y GIVING z.
          EXIT PROGRAM.
      END PROGRAM myMultiply.</lang>

This example uses user-defined functions, which were added in COBOL 2002.

Works with: GNU Cobol version 2.0

<lang cobol> IDENTIFICATION DIVISION.

      PROGRAM-ID. myTest.
      ENVIRONMENT DIVISION.
      CONFIGURATION SECTION.
      REPOSITORY.
          FUNCTION myMultiply.
      DATA DIVISION.
      WORKING-STORAGE SECTION.
      01  x   PIC 9(3) VALUE 3.
      01  y   PIC 9(3) VALUE 2.
      PROCEDURE DIVISION.
          DISPLAY myMultiply(x, y).
          STOP RUN.
      END PROGRAM myTest.
      IDENTIFICATION DIVISION.
      FUNCTION-ID. myMultiply.
      DATA DIVISION.
      LINKAGE SECTION.
      01  x   PIC 9(3).
      01  y   PIC 9(3).
      01  z   pic 9(9).
      PROCEDURE DIVISION USING x, y RETURNING z.
          MULTIPLY x BY y GIVING z.
          EXIT FUNCTION.
      END FUNCTION myMultiply.</lang>

Coco

As CoffeeScript. In addition, Coco provides some syntactic sugar for accessing the arguments array reminiscent of Perl's @_:

<lang coco>multiply = -> @@0 * @@1</lang>

Furthermore, when no parameter list is defined, the first argument is available as it:

<lang coco>double = -> 2 * it</lang>

CoffeeScript

<lang coffeescript>multiply = (a, b) -> a * b</lang>

ColdFusion

<lang coldfusion><cffunction name="multiply" returntype="numeric"> <cfargument name="a" type="numeric"> <cfargument name="b" type="numeric"> <cfreturn a * b> </cffunction></lang>

Common Lisp

Common Lisp has ordinary functions and generic functions.

Ordinary Functions

Ordinary functions operate on the values of argument expressions. Lisp functions terminate by returning one or more values, or by executing a non-local dynamic control transfer, in which case values are not returned. <lang lisp>(defun multiply (a b)

 (* a b))

(multiply 2 3)</lang>

User-Defined Compiler Optimization of Functions

In Lisp we can express optimizations of calls to a function using compiler macros. For instance, suppose we know that the multiply function, which may be in another module, simply multiplies numbers together. We can replace a call to multiply by a constant, if the arguments are constant expressions. Like the usual kind of Lisp macro, the compiler macro takes the argument forms as arguments, not the argument values. The special keyword &whole gives the macro access to the entire expression, which is convenient for the unhandled cases, whereby no transformation takes place: <lang lisp>(define-compiler-macro multiply (&whole expr a b)

 (if (and (constantp a) (constantp b))
   (* (eval a) (eval b))
   expr)) ;; no macro recursion if we just return expr; the job is done! </lang>

Lisp implementations do not have to honor compiler macros. Usually compilers make use of them, but evaluators do not.

Here is test of the macro using a CLISP interactive session. Note that the multiply function is not actually defined, yet it compiles and executes anyway, which shows that the macro provided the translation something.

$ clisp -q
[1]> (define-compiler-macro multiply (&whole expr a b)
  (if (and (constantp a) (constantp b))
    (* (eval a) (eval b))
    expr))
MULTIPLY
[2]> (defun test1 () (multiply 2 3))
TEST1
[3]> (compile 'test1)
TEST1 ;
NIL ;
NIL
[4]> (disassemble 'test1)

Disassembly of function TEST1
(CONST 0) = 6
[ ... ]
2 byte-code instructions:
0     (CONST 0)                           ; 6
1     (SKIP&RET 1)
NIL
[5]> (test1)
6

Generic Functions

Lisp's generic functions are part of the object system. Generic functions are compiled to ordinary functions, and so are called in the ordinary way. Internally, however, they have the special behavior of dispatching one or more methods based on specializable parameters.

Methods can be defined right inside the DEFGENERIC construct, but usually are written with separate DEFMETHODS.

Also, the DEFGENERIC is optional, since the first DEFMETHOD will define the generic function, but good practice. <lang lisp>

terrific example coming

</lang>

Cowgol

<lang cowgol>sub multiply(a: int32, b: int32): (rslt: int32) is

   rslt := a * b;

end sub</lang>

Creative Basic

<lang Creative Basic> DECLARE Multiply(N1:INT,N2:INT)

DEF A,B:INT

A=2:B=2

OPENCONSOLE

PRINT Multiply(A,B)

PRINT:PRINT"Press any key to close."

DO:UNTIL INKEY$<>""

CLOSECONSOLE

END

SUB Multiply(N1:INT,N2:INT)

    DEF Product:INT
    Product=N1*N2

RETURN Product

'Can also be written with no code in the subroutine and just RETURN N1*N2. </lang>

D

<lang d>// A function: int multiply1(int a, int b) {

   return a * b;

}

// Functions like "multiply1" can be evaluated at compile time if // they are called where a compile-time constant result is asked for: enum result = multiply1(2, 3); // Evaluated at compile time. int[multiply1(2, 4)] array; // Evaluated at compile time.

// A templated function: T multiply2(T)(T a, T b) {

   return a * b;

}

// Compile-time multiplication can also be done using templates: enum multiply3(int a, int b) = a * b;

pragma(msg, multiply3!(2, 3)); // Prints "6" during compilation.

void main() {

   import std.stdio;
   writeln("2 * 3 = ", result);

}</lang> Both the compile-time and run-time output:

6
2 * 3 = 6

Dart

<lang d>main(){

   print(multiply(1,2));
   print(multiply2(1,2));
   print(multiply3(1,2));

}

// the following definitions are equivalent // arrow syntax without type annotations multiply(num1, num2) => num1 * num2;

// arrow syntax with type annotations int multiply2(int num1, int num2) => num1 * num2;

// c style with curly braces int multiply3(int num1, int num2){

   return num1 * num2;

} </lang>

dc

For dc, the functions (called macros) are limited to names from 'a' to 'z' Create a function called 'm' <lang dc>[*] sm</lang> Use it (lm loads the function in 'm',x executes it, f shows the the stack.) <lang dc>3 4 lm x f = 12</lang>

Delphi

In addition to what is shown in the section Pascal, the following is possible too: <lang delphi>function multiply(a, b: integer): integer; begin

 result := a * b;

end;</lang>

Diego

<lang diego>begin_funct({number}, multiply)_param({number}, a, b);

   []_calc([a]*[b]);

end_funct[];

me_msg()_funct(multiply)_param(1,2);</lang>

Draco

Draco does not have the equivalent of a return statement. Instead, the last statement in a function must be an expression of the return type of the function.

<lang draco>proc multiply(word a, b) word:

   a * b

corp</lang>

Dragon

<lang dragon>func multiply(a, b) {

 return a*b 

}</lang>

DWScript

<lang Delphi>function Multiply(a, b : Integer) : Integer; begin

  Result := a * b;

end;</lang>

Dyalect

<lang Dyalect>func multiply(a, b) {

   a * b

}</lang>

Using lambda syntax:

<lang Dyalect>let multiply = (a, b) => a * b</lang>

Déjà Vu

<lang dejavu>multiply a b:

   * a b</lang>

E

<lang e>def multiply(a, b) {

   return a * b

}</lang> (This does not necessarily return a product, but whatever the "multiply" method of a returns. The parameters could be guarded to only accept standard numbers.)

It is also possible to write short anonymous function definitions which do not need explicit returns: <lang e>def multiply := fn a, b { a * b }</lang> This definition is identical to the previous except that the function object will not know its own name.

EasyLang

<lang>func multiply a b . r .

 r = a * b

. call multiply 7 5 res print res</lang>

EchoLisp

<lang lisp> (define (multiply a b) (* a b)) → multiply ;; (1) (multiply 1/3 666) → 222

a function is a lambda definition

multiply

    → (λ (_a _b) (#* _a _b))
The following is the same as (1)

(define multiply (lambda(a b) (* a b))) multiply

   → (🔒 λ (_a _b) (#* _a _b)) ;; a closure


a function may be compiled

(lib 'compile) (compile 'multiply "-float-verbose")

💡 [0] compiling _🔶_multiply ((#* _a _b))

object code (javascript)

var ref,top = _blocks[_topblock]; /* */return ( /* */(_stack[top] *_stack[1 + top]) /* */);

multiply → (λ (_a _b) (#🔶_multiply)) ;; compiled function </lang>

Efene

<lang efene>multiply = fn (A, B) {

   A * B

}

@public run = fn () {

   io.format("~p~n", [multiply(2, 5)])

}</lang>

Eiffel

<lang Eiffel> multiply(a, b: INTEGER): INTEGER do Result := a*b end </lang>

Ela

<lang Ela>multiply x y = x * y</lang> Anonymous function: <lang Ela>\x y -> x * y</lang>

Elena

<lang elena>real multiply(real a, real b)

       = a * b;</lang>

Anonymous function / closure: <lang elena>symbol f := (x,y => x * y);</lang> Root closure: <lang elena>f(x,y){ ^ x * y }</lang>

Elixir

<lang elixir>defmodule RosettaCode do

 def multiply(x,y) do
   x * y
 end
 
 def task, do: IO.puts multiply(3,5)

end

RosettaCode.task</lang>

Output:
15

Elm

<lang Elm> --There are multiple ways to create a function in Elm

--This is a named function multiply x y = x*y

--This is an anonymous function \x y -> x*y </lang>

Emacs Lisp

<lang Lisp>(defun multiply (x y)

 (* x y))</lang>

A "docstring" can be added as follows. This is shown by the Emacs help system and is good for human users. It has no effect on execution.

<lang Lisp>(defun multiply (x y)

 "Return the product of X and Y."
 (* x y))</lang>

Erlang

Using case, multiple lines

<lang erlang>% Implemented by Arjun Sunel -module(func_definition). -export([main/0]).

main() -> K=multiply(3,4), io :format("~p~n",[K]).

multiply(A,B) -> case {A,B} of {A, B} -> A * B end.</lang>

Output:
12
ok

In a single line

<lang erlang> -module(func_definition). -export([main/0]).

main() -> K=multiply(3,4), io :format("~p~n",[K]).

multiply(A,B) -> A * B.</lang> The output is the same.

ERRE

A statement function in ERRE is a single line function definition as in Fortran 77 or BASIC. These are useful in defining functions that can be expressed with a single formula. A statement function should appear in declaration part of the program. The format is simple - just type

FUNCTION f(x,y,z,…) 
   f=formula
END FUNCTION

The main features of function statement are:

1) You can use relational operators, so it's possible to "compact" an IF THEN ELSE statement but not loop statements: you must use a procedure for these.

2) Functions can have their own identifier (integer, string, real,double).

3) It's possible to declare function with no parameter: use FUNCTION f()........

4) Functions always return one value.

5) ERRE for C-64 admits only real with one parameter functions.

FUNCTION MULTIPLY(A,B)
   MULTIPLY=A*B
END FUNCTION

Usage:

 IF MULTIPLY(A,B)>10 THEN ......

or

 S=MULTIPLY(22,11)

Euphoria

<lang Euphoria>function multiply( atom a, atom b )

   return a * b

end function</lang> If you declare the arguments as object then sequence comprehension kicks in: <lang Euphoria>function multiply( object a, object b )

   return a * b

end function

sequence a = {1,2,3,4} sequence b = {5,6,7,8}

? multiply( 9, 9 ) ? multiply( 3.14159, 3.14159 ) ? multiply( a, b ) ? multiply( a, 7 ) ? multiply( 10.39564, b )</lang>

Output:
81
9.869587728
{5,12,21,32}
{7,14,21,28}
{51.9782,62.37384,72.76948,83.16512}

F#

The default will be an integer function but you can specify other types as shown: <lang fsharp>let multiply x y = x * y // integer let fmultiply (x : float) (y : float) = x * y</lang>

Factor

<lang factor>: multiply ( a b -- a*b ) * ;</lang>

Falcon

<lang falcon>function sayHiTo( name )

> "Hi ", name

end</lang>

FALSE

<lang false>[*] {anonymous function to multiply the top two items on the stack} m: {binding the function to one of the 26 available symbol names} 2 3m;! {executing the function, yielding 6}</lang>

Fantom

<lang fantom>class FunctionDefinition {

 public static Void main () 
 {
   multiply := |Int a, Int b -> Int| { a * b }
   echo ("Multiply 2 and 4: ${multiply(2, 4)}")
 }

}</lang>

Fermat

<lang fermat>Func Multiply(a, b) = a*b.</lang>

Fexl

<lang fexl>\multiply=(\x\y * x y)</lang> Or if I'm being cheeky: <lang fexl>\multiply=*</lang>

Fish

Functions cannot be named in Fish. However, they can be defined as new stacks that pull a certain number of arguments off the stack that came before. 2[ says pull 2 values off the stack and put them in a new, separate stack. ] says put all remaining values in the current stack onto the top of the stack below (the old stack). <lang fish>2[*]</lang>

Forth

<lang forth>: fmultiply ( F: a b -- F: c ) F* ;

multiply ( a b -- c ) * ;</lang>

Fortran

In FORTRAN I (1957), inline function could be defined at the beginning of the program. Let's note than to specify a floating point real the name of the statement function begins with an X (no type declaration) and to specify this is a function the name ends with a F. <lang fortran> XMULTF(X,Y)=X*Y</lang> And for interger multiplication: <lang fortran> MULTF(I,J)=I*J</lang>

In FORTRAN IV, FORTRAN 66 or later, define a function: <lang fortran>FUNCTION MULTIPLY(X,Y) REAL MULTIPLY, X, Y MULTIPLY = X * Y END</lang> And for integer multiplication: <lang fortran>FUNCTION MULTINT(X,Y) INTEGER MULTINT, X, Y MULTINT = X * Y END</lang>

In Fortran 95 or later, define an elemental function, so that this function can be applied to whole arrays as well as to scalar variables: <lang fortran>module elemFunc contains

   elemental function multiply(x, y)
       real, intent(in) :: x, y
       real :: multiply
       multiply = x * y
   end function multiply

end module elemFunc</lang> <lang fortran>program funcDemo

   use elemFunc
   
   real :: a = 20.0, b = 30.0, c
   real, dimension(5) :: x = (/ 1.0, 2.0, 3.0, 4.0, 5.0 /), y = (/ 32.0, 16.0, 8.0, 4.0, 2.0 /), z
   
   c = multiply(a,b)     ! works with either function definition above
   
   z = multiply(x,y)     ! element-wise invocation only works with elemental function

end program funcDemo</lang> It is worth noting that Fortran can call functions (and subroutines) using named arguments; e.g. we can call multiply in the following way: <lang fortran>c = multiply(y=b, x=a)  ! the same as multiply(a, b) z = multiply(y=x, x=y)  ! the same as multiply(y, x)</lang> (Because of commutativity property of the multiplication, the difference between multiply(x,y) and multiply(y,x) is not evident)

Also note that the function result can be declared with a different name within the routine: <lang fortran>module elemFunc contains

   elemental function multiply(x, y) result(z)
       real, intent(in) :: x, y
       real :: z
       z = x * y
   end function multiply

end module elemFunc</lang>

FreeBASIC

<lang freebasic>' FB 1.05.0 Win64

Function multiply(d1 As Double, d2 As Double) As Double

 Return d1 * d2

End Function</lang> This function could either be used for all numeric types (as they are implicitly convertible to Double) or could be overloaded to deal with each such type (there are 12 of them).

Alternatively, one could write a macro though this wouldn't be type-safe:

<lang freebasic>#Define multiply(d1, d2) (d1) * (d2)</lang>

Free Pascal

Free Pascal allows everything what Delphi allows. Note, using the special variable “result” requires {$modeSwitch result+}. This is the default in {$mode objFPC} and {$mode Delphi}.

Furthermore, after the assignment to the return variable further statements may follow. To ensure a value is returned immediately and no further following statements are processed, using the built-in exit procedure is possible too in {$mode objFPC}: <lang delphi>function multiply(a, b: integer): integer; begin

 exit(a * b);

end;</lang> If exit has been redefined in the current scope, its special meaning can be accessed via the fully-qualified identifier system.exit. Note, any enclosing finally frames of try … finally … end are processed first before actually returning from the function. As a consequence of that, exit may not appear within a finally frame.

Frink

<lang frink>multiply[x,y] := x*y</lang>

Futhark

<lang Futhark> let multiply (x: i32, y: i32) : i32 = x * y </lang>

FutureBasic

<lang futurebasic>window 1

local fn multiply( a as long, b as long ) as long end fn = a * b

print fn multiply( 3, 9 )

HandleEvents</lang> Output:

27

Gambas

Click this link to run this code <lang gambas>Public Sub Main()

Print Multiply(56, 4.66)

End

Public Sub Multiply(f1 As Float, f2 As Float) As Float

Return f1 * f2

End</lang> Output:

260.96

GAP

<lang gap>multiply := function(a, b)

   return a*b;

end;</lang>

GML

In GML one can not define a function but in Game Maker there is a script resource, which is the equivalent of a function as defined here. Scripts can be exported to or imported from a text file with the following format: <lang GML>#define multiply a = argument0 b = argument1 return(a * b)</lang>

Gnuplot

<lang Gnuplot>multiply(x,y) = x*y

  1. then for example

print multiply(123,456)</lang>

Go

Function return types in Go are statically typed and never depend on argument types.

The return statement can contain an expression of the function return type: <lang go>func multiply(a, b float64) float64 {

  return a * b

}</lang> Alternatively, if the return value is named, the return statement does not require an expression: <lang go>func multiply(a, b float64) (z float64) {

  z = a * b
  return

}</lang>

Golfscript

<lang golfscript>{*}:multiply;</lang>

Groovy

<lang groovy>def multiply = { x, y -> x * y }</lang> Test Program: <lang groovy>println "x * y = 20 * 50 = ${multiply 20, 50}"</lang>

Output:
x * y = 20 * 50 = 1000

Halon

<lang halon>function multiply( $a, $b ) {

   return $a * $b;

}</lang>

Haskell

<lang haskell>multiply x y = x * y</lang> Alternatively, with help of auto-currying, <lang haskell>multiply = (*)</lang> You can use lambda-function <lang haskell>multiply = \ x y -> x*y</lang>

Haxe

<lang haxe>function multiply(x:Float, y:Float):Float{

  return x * y;

}</lang>

hexiscript

<lang hexiscript>fun multiply a b

 return a * b

endfun</lang>

HicEst

<lang hicest>FUNCTION multiply(a, b)

  multiply = a * b

END</lang>

HolyC

<lang holyc>F64 Multiply(F64 a, F64 b) {

 return a * b;

}

F64 x; x = Multiply(42, 13.37); Print("%5.2f\n", x);</lang>

Hy

Function definition: <lang clojure>(defn multiply [a b]

 (* a b))</lang>

Lambda definition: <lang clojure>(def multiply (fn [a b] (* a b)))</lang>

i

<lang i> concept multiply(a, b) { return a*b } </lang>

Icon and Unicon

<lang Icon>procedure multiply(a,b) return a * b end</lang>

IDL

The task description is unclear on what to do when the arguments to the function are non-scalar, so here's multiple versions: <lang idl>function multiply ,a,b

 return, a* b

end</lang> If "a" and "b" are scalar, this will return a scalar. If they are arrays of the same dimensions, the result is an array of the same dimensions where each element is the product of the corresponding elements in "a" and "b".

Alternatively, there's this possibility: <lang idl>function multiply ,a,b

 return, product([a, b])

end</lang> This will yield the same result for scalars, but if "a" and "b" are arrays it will return the product of all the elements in both arrays.

Finally, there's this option: <lang idl>function multiply ,a,b

 return, a # b

end</lang> This will return a scalar if given scalars, if given one- or two-dimensional arrays it will return the matrix-product of these arrays. E.g. if given two three-element one-dimensional arrays (i.e. vectors), this will return a 3x3 matrix.

Inform 6

<lang inform6>[ multiply a b;

 return a * b;

];</lang>

Inform 7

<lang inform7>To decide which number is (A - number) multiplied by (B - number): decide on A * B.</lang>

Io

<lang io>multiply := method(a,b,a*b)</lang>

IWBASIC

<lang IWBASIC> '1. Not Object Oriented Program

DECLARE Multiply(N1:INT,N2:INT),INT

DEF A,B:INT

A=2:B=2

OPENCONSOLE

PRINT Multiply(A,B)

PRINT

'When compiled as a console only program, a press any key to continue is automatic. CLOSECONSOLE

END

SUB Multiply(N1:INT,N2:INT),INT

    DEF Product:INT

    Product=N1*N2

RETURN Product ENDSUB

'Can also be written with no code in the subroutine and just RETURN N1*N2.


'2. Not Object Oriented Program Using A Macro

$MACRO Multiply (N1,N2) (N1*N2)

DEF A,B:INT

A=5:B=5

OPENCONSOLE

PRINT Multiply (A,B)

PRINT

'When compiled as a console only program, a press any key to continue is automatic. CLOSECONSOLE

END


'3. In An Object Oriented Program

CLASS Associate 'functions/methods DECLARE Associate:'object constructor DECLARE _Associate:'object destructor '***Multiply declared*** DECLARE Multiply(UnitsSold:UINT),UINT 'members DEF m_Price:UINT DEF m_UnitsSold:UINT DEF m_SalesTotal:UINT ENDCLASS

DEF Emp:Associate

m_UnitsSold=10

Ass.Multiply(m_UnitsSold)

OPENCONSOLE

PRINT"Sales total: ",:PRINT"$"+LTRIM$(STR$(Emp.m_SalesTotal))

PRINT

CLOSECONSOLE

END

'm_price is set in constructor SUB Associate::Multiply(UnitsSold:UINT),UINT

    m_SalesTotal=m_Price*UnitsSold
    RETURN m_SalesTotal

ENDSUB

SUB Associate::Associate()

    m_Price=10

ENDSUB

SUB Associate::_Associate() 'Nothing to cleanup ENDSUB

</lang>

J

<lang j>multiply=: *</lang> Works on conforming arrays of any rank (any number of dimensions, as long as the dimensions of one are a prefix of the dimensions of the other): atoms, lists, tables, etc.

Or, more verbosely (and a bit slower, though the speed difference should be unnoticeable in most contexts): <lang J>multiply=: dyad define

 x * y

)</lang> Here we use an explicit definition (where the arguments are named) rather than a tacit version (where the arguments are implied). In explicit J verbs, x is the left argument and y is the right argument.

(Note, by the way, that explicit definitions are a subset of tacit definitions -- when the arguments are explicitly named they are still implied in the larger context containing the definition.)

Java

There are no global functions in Java. The equivalent is to define static methods in a class (here invoked as "Math.multiply(a,b)"). Overloading allows us to define the method for multiple types. <lang java>public class Math {

    public static    int multiply(   int a,    int b) { return a*b; }
    public static double multiply(double a, double b) { return a*b; }

}</lang>

JavaScript

ES1-*

Function Declaration <lang javascript>function multiply(a, b) {

 return a*b; 

}</lang>

ES3-*

Function Expression <lang javascript>var multiply = function(a, b) {

   return a * b;

};</lang>

Named Function Expression <lang javascript>var multiply = function multiply(a, b) {

   return a * b;

};</lang>

Method Definition <lang javascript>var o = {

 multiply: function(a, b) {
   return a * b;
 }

};</lang>

ES5-*

Accessors <lang javascript>var o = {

 get foo() {
   return 1;
 }, 
 set bar(value) {
   // do things with value
 }

};</lang>


ES6-*

Arrow Function <lang javascript>var multiply = (a, b) => a * b; var multiply = (a, b) => { return a * b }; </lang>

Concise Body Method Definition <lang javascript>var o = {

 multiply(a, b) {
   return a * b;
 }

};</lang>

Generator Functions <lang javascript>function * generator() {

 yield 1;

}</lang>

Joy

<lang joy>DEFINE multiply == * .</lang>

jq

Example of a simple function definition:<lang jq>def multiply(a; b): a*b;</lang> Example of the definition of an inner function:<lang jq># 2 | generate(. * .) will generate 2, 4, 16, 256, ... def generate(f): def r: ., (f | r); r;</lang> The previous example (generate/1) also illustrates that a function argument can be a function or composition of functions. Here is another example:<lang jq>def summation(f): reduce .[] as $x (0; . + ($x|f));</lang> summation/1 expects an array as its input and takes a function, f, as its argument. For example, if the input array consists of JSON objects with attributes "h" and "w", then to compute SIGMA (h * w) we could simply write:<lang jq>summation( .h * .w)</lang>

Julia

Works with: Julia version 0.6

General function definition:

<lang julia>function multiply(a::Number, b::Number)

 return a * b

end</lang>

Julia also supports `assignment` definition as shorthand:

<lang julia>multiply(a, b) = a * b</lang>

And lambda calculus:

<lang julia>multiply = (a, b) -> a * b</lang>

Kaya

<lang kaya>program test;

// A function definition in Kaya: Int multiply(Int a, Int b) {

   return a * b;

}

// And calling a function: Void main() {

   putStrLn(string( multiply(2, 3) ));

}</lang>

Klingphix

<lang Klingphix>:multiply * ;

2 3 multiply print { 6 }</lang>

Kotlin

<lang kotlin>// One-liner fun multiply(a: Int, b: Int) = a * b

// Proper function definition fun multiplyProper(a: Int, b: Int): Int {

   return a * b

}</lang>

Lambdatalk

<lang Scheme> {def multiply

{lambda {:a :b}
 {* :a :b}}}

{multiply 3 4} -> 12

could be written as a variadic function:

{def any_multiply

{lambda {:n}   // thanks to variadicity of *
 {* :n}}}

{any_multiply 1 2 3 4 5 6} -> 720

</lang>

langur

A function body may use curly braces, but it is not required if it is a single expression.

A return statement may be used, but a function's last value is its implicit return value.

Functions defined with explicit parameters may be closures, and those defined with implied parameters are not.

Langur functions are first-order. They are pure in terms of setting values, though not in terms of I/O.

explicit parameters

Explicit parameters are defined with parentheses after the f token, with no spacing. To specify no parameters, use an empty set of parentheses. <lang langur>val .multiply = f(.x, .y) .x x .y .multiply(3, 4)</lang>

implied parameters

Parameters are implied when the f token is not immediately followed by parentheses without spacing. The implied order of implied parameters is based on the string sort order of their names, not their order within the function. <lang langur>val .multiply = f .x x .y .multiply(3, 4)</lang>

operator implied functions

Operator implied functions are built using an infix operator between curly braces on an f token.

Works with: langur version 0.6.6

<lang langur>val .multiply = f{x} .multiply(3, 4)</lang>

nil left partially implied functions

These are built with an infix operator and one operand inside the f{...} tokens.

Works with: langur version 0.8.11

<lang langur>val .times3 = f{x 3} map .times3, [1, 2, 3]</lang>

Lasso

Lasso supports multiple dispatch — signature definitions determine which method will be invoked.

<lang Lasso>define multiply(a,b) => { return #a * #b }</lang>

As this function is so simple it can also be represented like so:

<lang Lasso>define multiply(a,b) => #a * #b</lang>

Using multiple dispatch, different functions will be invoked depending on the functions input.

<lang Lasso>// Signatures that convert second input to match first input define multiply(a::integer,b::any) => #a * integer(#b) define multiply(a::decimal,b::any) => #a * decimal(#b)

// Catch all signature define multiply(a::any,b::any) => decimal(#a) * decimal(#b)</lang>

Latitude

Latitude methods are defined using curly braces {} and assigned to variables like any other value. Arguments are implicitly named $1, $2, etc.

<lang latitude>multiply := { $1 * $2. }.</lang>

Calling a method is done either with parentheses or with a colon.

<lang latitude>multiply (2, 3). multiply: 2, 3.</lang>

If a method is intended to be used as a first-class value or stored in a data structure, the automatic evaluation behavior of methods can be undesired. In this case, one can wrap a method in a Proc with the proc method. Proc objects can then be later called explicitly with call.

<lang latitude>multiply := proc { $1 * $2. }. multiply call (2, 3). multiply call: 2, 3.</lang>

LFE

<lang lisp> (defun mutiply (a b)

 (* a b))

</lang>

Liberty BASIC

<lang lb>' define & call a function

print multiply( 3, 1.23456)

wait

function multiply( m1, m2)

   multiply =m1 *m2

end function

end</lang>

Lily

<lang Lily>define multiply(a: Integer, b: Integer): Integer {

 return a * b

}</lang>

Lingo

<lang lingo>on multiply (a, b)

 return a * b

end</lang>

LiveCode

LiveCode has a built-in method called multiply, so there is an extra y to avoid an error. <lang LiveCode>function multiplyy n1 n2

   return n1 * n2

end multiplyy

put multiplyy(2,5) -- = 10</lang>

Locomotive Basic

<lang locobasic>10 DEF FNmultiply(x,y)=x*y 20 PRINT FNmultiply(2,PI)</lang> Function names are always preceded by "FN" in Locomotive BASIC. Also, PI is predefined by the interpreter as 3.14159265.

<lang logo>to multiply :x :y

 output :x * :y

end</lang>

LSE64

<lang lse64>multiply  : * multiply. : *. # floating point</lang>

Lua

<lang Lua>function multiply( a, b )

   return a * b

end</lang>

Lucid

<lang lucid>multiply(x,y) = x * y</lang>

M2000 Interpreter

A Module can return value

A module can return value to stack of values. Calling a module we place parent stack to module, so we can read any value. <lang M2000 Interpreter> Module Checkit {

     Module Multiply (a, b) {
           Push a*b
     }
     Multiply 10, 5
     Print Number=50
     
     Module Multiply {
           Push Number*Number
     }
     
     Multiply 10, 5
     Print Number=50
     \\ push before call
     Push 10, 5
     Multiply
     Read A
     Print A=50
     Push 10, 2,3 : Multiply : Multiply: Print Number=60
     Module Multiply {
           If not match("NN") Then Error "I nead two numbers"
           Read a, b
           Push a*b
     }
     Call Multiply 10, 5
     Print Number=50
     \\ now there are two values in stack 20 and 50
     Multiply

} Call Checkit, 20, 50 Print Number=1000 </lang>

A Local Function Definition

There are two types of function, the normal and the lambda. If a Function return string then we have to use $ at the end of function name. <lang M2000 Interpreter> Module Checkit {

     \\ functions can shange by using a newer definition
     \\ function Multiply is local, and at the exit of Checkit, erased.
     Function Multiply (a, b) {
           =a*b
     }
     Print Multiply(10, 5)=50
     
     Function Multiply {
           =Number*Number
     }
     
     Print Multiply(10, 5)=50
     Function Multiply {
           If not match("NN") Then Error "I nead two numbers"
           Read a, b
           =a*b
     }
     Print Multiply(10, 5)=50
     Function Multiply {
           Read a as long, b as long
           =a*b
     }
     Z=Multiply(10, 5)
     Print Z=50, Type$(Z)="Long"
     Function Multiply(a as decimal=1, b as decimal=2) {
           =a*b
     }
     D=Multiply(10, 5)
     Print D=50, Type$(D)="Decimal"
     D=Multiply( , 50)
     Print D=50, Type$(D)="Decimal"
     D=Multiply( 50)
     Print D=100, Type$(D)="Decimal"
     \\ by reference plus using type
     Function Multiply(&a as decimal, &b as decimal) {
           =a*b
           a++
           b--
     }
     alfa=10@
     beta=20@
     D=Multiply(&alfa, &beta)
     Print D=200, alfa=11,beta=19, Type$(D)="Decimal"
     \\ Using Match() to identify type of items at the top of stack
     Function MultiplyALot {
           M=Stack 
           While Match("NN") {
                 mul=Number*Number
                 Stack M {
                       Data mul  ' at the bottom
                 }
           }
           =Array(M)
     }
     
     K=MultiplyALot(1,2,3,4,5,6,7,8,9,10)
     N=Each(K)
     While N {
           Print Array(N),     ' we get 2  12   30   56   90
     }
     Print

} Checkit </lang>

A Lambda Function

Lambda function is first citizen. We can push it to stack and make another reading from stack. Lambda can use closures as static variables, some of them are pointers so if we copy a lambda we just copy the pointer. Pointers are containers like pointer to array, inventory and stack. Here we define string lambda function (there is a numeric also)

<lang M2000 Interpreter> Module CheckIt {

     A$=Lambda$ N$="Hello There" (x) ->{
           =Mid$(N$, x)
     }
     Print A$(4)="lo There"
     Push A$

} CheckIt Read B$ Print B$(1)="Hello There" Function List$ {

     Dim Base 1,   A$()
     A$()=Array$([])  ' make an array from stack items
     =lambda$ A$() (x) -> {
           =A$(x)
     }

} \\ change definition/closures B$=List$("Hello", "Rosetta", "Function") Print B$(1)="Hello" </lang>

M4

<lang M4>define(`multiply',`eval($1*$2)')

multiply(2,3)</lang>

MAD

MAD supports two types of function declarations. One simply evaluates an expression: <lang mad> INTERNAL FUNCTION MULT.(A,B) = A * B</lang>

Another allows multiple lines to be executed: <lang mad> INTERNAL FUNCTION(A, B)

           ENTRY TO MULT.
           FUNCTION RETURN A * B
           END OF FUNCTION</lang>

There are several quirks here. First, the length of any identifier must not be longer than six characters, and the name of a function must end in a period (which does not count towards the length). Therefore, the function is called MULT. instead of multiply.

Second, in a multi-line function it is actually the entry point that is named, and a function may have several separate entry points, which need not be at the beginning of the function. Control is transferred to whichever one is called.

Third, all variables are global to the compilation unit. In both examples above, A and B will be set to the values that are passed in, and they will persist after the function has run. They may be declared elsewhere, or they will be of the default type (the NORMAL MODE).

Make

In makefile, a function may be defined as a rule, with recursive make used to retrieve the returned value. <lang make>A=1 B=1

multiply:

  @expr $(A) \* $(B)</lang>

Invoking it <lang make>make -f mul.mk multiply A=100 B=3 > 300</lang> Using gmake, the define syntax is used to define a new function

Works with: gmake

<lang make>A=1 B=1

define multiply

  expr $(1) \* $(2)

endef

do:

  @$(call multiply, $(A), $(B))

|gmake -f mul.mk do A=5 B=3</lang>

Maple

<lang maple>multiply:= (a, b) -> a * b;</lang>

Mathematica / Wolfram Language

There are two ways to define a function in Mathematica.

Defining a function as a transformation rule: <lang Mathematica>multiply[a_,b_]:=a*b</lang> Defining a pure function: <lang Mathematica>multiply=#1*#2&</lang>

Maxima

<lang Maxima>f(a, b):= a*b;</lang>

MAXScript

<lang maxscript>fn multiply a b = (

   a * b

)</lang>

Mercury

<lang Mercury>% Module ceremony elided...

- func multiply(integer, integer) = integer.

multiply(A, B) = A * B.</lang>

Metafont

Metafont has macros, rather than functions; through those the language can be expanded. According to the kind of macro we are going to define, Metafont has different ways of doing it. The one suitable for this task is called primarydef. <lang metafont>primarydef a mult b = a * b enddef;</lang> <lang metafont>t := 3 mult 5; show t; end</lang> The primarydef allows to build binary operators with the same priority as *. For a more generic macro, we can use instead <lang metafont>def mult(expr a, b) = (a * b) enddef; t := mult(2,3); show t; end</lang>

min

'* is syntax sugar for (*), which is an anonymous function that takes two numbers from the data stack, multiplies them, and leaves the result on the data stack. To give it a name, we can use the : sigil which is syntax sugar for define. <lang min>'* :multiply</lang>

MiniScript

<lang MiniScript>multiply = function(x,y)

   return x*y

end function

print multiply(6, 7)</lang>

Output:
42

MiniZinc

function var int:multiply(a: var int,b: var int) = 
    a*b;

МК-61/52

ИП0 ИП1 * В/О

Function (subprogram) that multiplies two numbers. Parameters in registers Р0 and Р1, the result (return value) in register X. Commands ИП0 and ИП1 cause the contents of the corresponding registers in the stack, the more they multiplied (command *) and then code execution goes to the address from which the call subprogram (command В/О).

Modula-2

<lang modula2>PROCEDURE Multiply(a, b: INTEGER): INTEGER; BEGIN

 RETURN a * b

END Multiply;</lang>

Modula-3

<lang modula3>PROCEDURE Multiply(a, b: INTEGER): INTEGER = BEGIN

 RETURN a * b;

END Multiply;</lang>

MUMPS

<lang MUMPS>MULTIPLY(A,B);Returns the product of A and B

QUIT A*B</lang>

Nanoquery

<lang nanoquery>def multiply(a, b)

   return a * b

end</lang>

Neko

<lang Neko>var multiply = function(a, b) {

   a * b

}

$print(multiply(2, 3))</lang>

Output: 6

Nemerle

<lang Nemerle>public Multiply (a : int, b : int) : int // this is either a class or module method {

   def multiply(a, b) { return a * b }   // this is a local function, can take advantage of type inference
   return multiply(a, b)

}</lang>

NESL

<lang nesl>function multiply(x, y) = x * y;</lang> The NESL system responds by reporting the type it has inferred for the function:

multiply = fn : (a, a) -> a :: (a in number)

NetRexx

<lang NetRexx>/* NetRexx */ options replace format comments java crossref savelog symbols binary

pi = 3.14159265358979323846264338327950 radiusY = 10 in2ft = 12 ft2yds = 3 in2mm = 25.4 mm2m = 1 / 1000 radiusM = multiply(multiply(radiusY, multiply(multiply(ft2yds, in2ft), in2mm)), mm2m)

say "Area of a circle" radiusY "yds radius: " multiply(multiply(radiusY, radiusY), pi).format(3, 3) "sq. yds" say radiusY "yds =" radiusM.format(3, 3) "metres" say "Area of a circle" radiusM.format(3, 3)"m radius:" multiply(multiply(radiusM, radiusM), pi).format(3, 3)"m**2"


/**

* Multiplication function
*/

method multiply(multiplicand, multiplier) public static returns Rexx

 product = multiplicand * multiplier
 return product</lang>
Output:
Area of a circle 10 yds radius:  314.159 sq. yds
10 yds =   9.144 metres
Area of a circle   9.144m radius: 262.677m**2

NewLISP

<lang NewLISP>> (define (my-multiply a b) (* a b)) (lambda (a b) (* a b)) > (my-multiply 2 3) 6</lang>

Nial

Using variables <lang nial>multiply is operation a b {a * b}</lang> Using it <lang nial>|multiply 2 3 =6</lang> Point free form <lang nial>mul is *</lang> Using it <lang nial>|mul 3 4 =12</lang> Nial also allows creation of operators <lang nial>multiply is op a b {a * b}</lang> Using it. <lang nial>|2 multiply 3 =6 |multiply 2 3 =6</lang> Since this is an array programming language, any parameters can be arrays too <lang nial>|mul 3 [1,2] =3 6 |mul [1,2] [10,20] =10 40</lang>

Nim

Nim has a magic variable, `result`, which can be used as a substitute for `return`. The `result` variable will be returned implicitly. <lang nim>proc multiply(a, b: int): int =

 result = a * b</lang>

Here is the same function but with the use of the `return` keyword. <lang nim>proc multiply(a, b: int): int =

 return a * b</lang>

The last statement in a function implicitly is the result value: <lang nim>proc multiply(a, b: int): int = a * b</lang>

OASYS

<lang oasys_oac>method int multiply int x int y {

 return x * y

}</lang>

OASYS Assembler

OASYS Assembler requires a prefix and suffix on names to indicate their types (an omitted suffix means a void type). <lang oasys_oaa>[&MULTIPLY#,A#,B#],A#<,B#<MUL RF</lang>

Oberon-2

Oberon-2 uses procedures, and has a special procedure called a "Function Procedure" used to return a value. <lang oberon2>PROCEDURE Multiply(a, b: INTEGER): INTEGER;

BEGIN 
   RETURN a * b;
END Multiply;</lang>

Objeck

<lang objeck>function : Multiply(a : Float, b : Float) ~, Float {

  return a * b;

}</lang>

OCaml

<lang ocaml>let int_multiply x y = x * y let float_multiply x y = x *. y</lang>

Octave

<lang octave>function r = mult(a, b)

 r = a .* b;

endfunction</lang>

Oforth

Function #* is already defined : it removes 2 objects from the stack and returns on the stack the product of them.

If necessary, we can create a function with name multiply, but, it will just call *

<lang Oforth>: multiply * ;</lang>

It is also possible to create a function with declared paramaters. In this case, if we define n parameters, n objects will be removed from the stack and stored into those parameters :

<lang Oforth>: multiply2(a, b) a b * ;</lang>

A function return value (or values) is always what remains on the stack when the function ends. There is no syntax to define explicitely what is the return value(s) of a function.

Ol

Function creation implemented using keyword 'lambda'. This created anonymous function can be saved into local or global variable for further use. <lang scheme> (lambda (x y)

  (* x y))

</lang>

Ol has two fully equal definitions of global named function (second one is syntactic sugar for first one). In fact both of them is saving the created lambda in global variable. <lang scheme> (define multiply (lambda (x y) (* x y)))

(define (multiply x y) (* x y)) </lang>

And only one definition of local named functions (with immediate calculation). This type of definition helps to implement local recursions. <lang scheme> (let multiply ((x n) (y m))

  (* x y))
example of naive multiplication function implementation using local recursion

(define (multiply x y)

  (let loop ((y y) (n 0))
     (if (= y 0)
        n
        (loop (- y 1) (+ n x)))))

(print (multiply 7 8))

==> 56

</lang>

OOC

<lang ooc> multiply: func (a: Double, b: Double) -> Double {

 a * b 

} </lang>

ooRexx

Internal Procedure

<lang rexx>SAY multiply(5, 6) EXIT multiply:

   PROCEDURE
   PARSE ARG x, y
   RETURN x*y</lang>

::Routine Directive

<lang oorexx> say multiply(5, 6)

routine multiply
   use arg x, y
   return x *y </lang>

Accomodate large factors

<lang oorexx>say multiply(123456789,987654321) say multiply_long(123456789,987654321)

routine multiply
   use arg x, y
   return x *y
routine multiply_long
   use arg x, y
   Numeric Digits (length(x)+length(y))
   return x *y </lang>
Output:
1.21932631E+17
121932631112635269

OpenEdge/Progress

<lang Progress (Openedge ABL)>function multiply returns dec (a as dec , b as dec ):

 return a * b .

end.</lang>

Oz

<lang oz>fun {Multiply X Y}

  X * Y

end</lang> Or by exploiting first-class functions: <lang oz>Multiply = Number.'*'</lang>

PARI/GP

<lang parigp>multiply(a,b)=a*b;</lang> or <lang parigp>multiply=(a,b)->a*b;</lang> Note that in both cases the ; is part of the definition of the function, not of the function itself: it suppresses the output of the function body, but does not suppress the output of the function when called. To do that, either double the semicolon (which will suppress the output of both) or wrap in braces: <lang parigp>multiply={(a,b)->a*b;}</lang> which will return a function which calculates but does not return the product.

Pascal

see also: Delphi and Free Pascal

<lang pascal>function multiply(a, b: real): real; begin multiply := a * b end;</lang> After a function has been activated, there must have be exactly one assignment to the (implicitly declared) variable bearing the same name as of the function. Many processors do not comply with this specification, though, and allow overwriting the return value multiple times.

Perl

The most basic form: <lang perl>sub multiply { return $_[0] * $_[1] }</lang> or simply: <lang perl>sub multiply { $_[0] * $_[1] }</lang> Arguments in Perl subroutines are passed in the @_ array, and they can be accessed directly, first one as $_[0], second one as $_[1], etc. When the above function is called with only one or no arguments then the missing ones have an undefined value which is converted to 0 in multiplication.

This is an example using subroutine prototypes: <lang perl>sub multiply( $$ ) {

  my ($a, $b) = @_;
  return $a * $b;

}</lang> The above subroutine can only be called with exactly two scalar values (two dollar signs in the signature) but those values may be not numbers or not even defined. The @_ array is unpacked into $a and $b lexical variables, which are used later.

The arguments can be automatically unpacked into lexical variables using the experimental signatures feature (in core as of 5.20): <lang perl>use experimental 'signatures'; sub multiply ($x, $y) {

   return $x * $y;

}</lang>

Phix

Library: Phix/basics
with javascript_semantics
function multiply(atom a, atom b)
    return a*b
end function

Phixmonti

<lang Phixmonti>def multiply * enddef</lang>

PHL

<lang phl>@Integer multiply(@Integer a, @Integer b) [ return a * b; ]</lang>

PHP

<lang php>function multiply( $a, $b ) {

   return $a * $b;

}</lang>

Picat

<lang php>multiply(A, B) = A*B. </lang>

PicoLisp

<lang PicoLisp>(de multiply (A B)

  (* A B) )</lang>

Pike

<lang pike>int multiply(int a, int b){

  return a * b;

}</lang>

PL/I

<lang pli>PRODUCT: procedure (a, b) returns (float);

  declare (a, b) float;
  return (a*b);

end PRODUCT;</lang>

PL/SQL

<lang plsql>FUNCTION multiply(p_arg1 NUMBER, p_arg2 NUMBER) RETURN NUMBER IS

 v_product NUMBER;

BEGIN

 v_product := p_arg1 * p_arg2;
 RETURN v_product;

END;</lang>

Plain English

The Multiply a number by another number routine is already defined in the noodle, so we need to tweak the wording slightly so the compiler doesn't complain about redefinition (or so the definition isn't recursive). Note that the number refers to the parameter a number and the other number refers to the parameter another number. <lang plainenglish>To multiply a number with another number: Multiply the number by the other number.</lang>

Pop11

<lang pop11>define multiply(a, b);

   a * b

enddefine;</lang>

PostScript

Inbuilt: <lang postscript>3 4 mul</lang> Function would be: <lang postscript>/multiply{

   /x exch def
   /y exch def
   x y mul =

}def</lang>

PowerShell

The most basic variant of function definition would be the kind which uses positional parameters and therefore doesn't need to declare much: <lang powershell>function multiply {

   return $args[0] * $args[1]

}</lang> Also, the return statement can be omitted in many cases in PowerShell, since every value that "drops" out of a function can be used as a "return value": <lang powershell>function multiply {

   $args[0] * $args[1]

}</lang> Furthermore, the function arguments can be stated and named explicitly: <lang powershell>function multiply ($a, $b) {

   return $a * $b

}</lang> There is also an alternative style for declaring parameters. The choice is mostly a matter of personal preference: <lang powershell>function multiply {

   param ($a, $b)
   return $a * $b

}</lang> And the arguments can have an explicit type: <lang powershell>function multiply ([int] $a, [int] $b) {

   return $a * $b

}</lang>

Processing

Processing is based on Java, and thus uses a familiar C-style syntax for function definition—as it does for much else. For the sake of argument, this implementation of multiply uses single-precision floats: other numeral types are available. <lang java>float multiply(float x, float y) {

   return x * y;

}</lang>

Processing Python mode

Processing Python mode is based on Jython, a fully implemented Python 2 interpreter, and thus uses familiar Python syntax for function definition-as it does for much else. <lang python>def multiply(x, y):

   return x * y</lang>

Prolog

Prolog, as a logic programming languages, does not have user-supplied functions available. It has only predicates; statements which are "true" or "false". In cases where values have to be "returned" a parameter is passed in that is unified with the result. In the following predicate the parameter "P" (for "Product") is used in this role. The following code will work in any normal Prolog environment (but not in things like Turbo Prolog or Visual Prolog or their ilk): <lang Prolog>multiply(A, B, P) :- P is A * B.</lang> This is what it looks like in use: <lang Prolog>go :-

 multiply(5, 2, P),
 format("The product is ~d.~n", [P]).</lang>

This can be a little bit jarring for those used to languages with implicit return values, but it has its advantages. For example unit testing of such a predicate doesn't require special frameworks to wrap the code: <lang Prolog>test_multiply :-

 multiply(5, 2, 10),  % this will pass
 multiply(3, 4, 11).  % this will not pass</lang>

Still, the lack of user-defined functions remains an annoyance.

Prolog, however, is a remarkably malleable language and through its term re-writing capabilities the function-style approach could be emulated. The following code relies on the function_expansion pack (separately installed through the packs system) for SWI-Prolog. Similar code could be made in any Prolog implementation, however. <lang Prolog>:- use_module(library(function_expansion)).

user:function_expansion(multiply(A, B), P, P is A * B).  % "function" definition

go :-

 format("The product is ~d.~n", [multiply(5, 2)]).</lang>

While the function definition is perhaps a bit more involved, the function use is now pretty much the same as any other language people are used to. The "magic" is accomplished by the compiler rewriting the go/0 term into the following code: <lang Prolog>go :-

 A is 5*2,
 format('The product is ~d.~n', [A]).</lang>

PureBasic

<lang PureBasic>Procedure multiply(a,b)

 ProcedureReturn a*b

EndProcedure</lang>

Python

Function definition: <lang python>def multiply(a, b):

   return a * b</lang>

Lambda function definition: <lang python>multiply = lambda a, b: a * b</lang> A callable class definition allows functions and classes to use the same interface: <lang python>class Multiply:

   def __init__(self):
       pass
   def __call__(self, a, b):
       return a * b

multiply = Multiply() print multiply(2, 4) # prints 8</lang> (No extra functionality is shown in this class definition).

Q

<lang q>multiply:{[a;b] a*b}</lang> or <lang q>multiply:{x*y}</lang> or <lang q>multiply:*</lang> Using it <lang q>multiply[2;3]

6</lang>

Quack

You have several ways to define a function in Quack. You can do it by the classic way: <lang quack>fn multiply[ a; b ]

 ^ a * b

end</lang>

Using lambda-expressions: <lang quack>let multiply :- fn { a; b | a * b }</lang>

And using partial anonymous functions:<lang quack>let multiply :- &(*)</lang>

Quackery

<lang quackery>[ * ] is multiply ( n n --> n )</lang> In the Quackery shell (REPL):

/O> 2 3 multiply
...

Stack: 6

Quackery is a stack language: arguments are assumed to be on the stack when functions are called. This means that we don't need to name the parameters of a function. For this reason, we call functions words, because in code they really are just words written one after the other.

( n n --> n ) is a comment that indicates multiply takes two numbers from the data stack and leaves one number on the data stack afterward. Stack comments are not necessary, but they are good form. They show how words interact with the data stack at a glance.

Words don't have to be named. We could have written the above as: <lang quackery>2 ' [ * ] 3 swap do</lang> By quoting the nest containing * with the ' word, we have prevented it from being executed immediately and placed it on the data stack. Now it can be manipulated like any other nest or data stack object. We can use do to execute the contents of the nest.

R

<lang rsplus>mult <- function(a,b) a*b</lang> In general: <lang rsplus>mult <- function(a,b) {

 a*b
 # or:
 # return(a*b)

}</lang>

Racket

A simple function definition that takes 2 arguments.

<lang racket>(define (multiply a b) (* a b))</lang>

Using an explicit lambda or λ is completely equivalent: <lang racket>(define multiply (lambda (a b) (* a b)))</lang>

<lang racket>(define multiply (λ (a b) (* a b)))</lang>

Note that * is a function value, so the following code also works (although multiply will now be variadic function).

<lang racket>(define multiply *)</lang>

Raku

(formerly Perl 6) Without a signature: <lang perl6>sub multiply { return @_[0] * @_[1]; }</lang> The return is optional on the final statement, since the last expression would return its value anyway. The final semicolon in a block is also optional. (Beware that a subroutine without an explicit signature, like this one, magically becomes variadic (rather than nullary) only if @_ or %_ appear in the body.) In fact, we can define the variadic version explicitly, which still works for two arguments: <lang perl6>sub multiply { [*] @_ }</lang> With formal parameters and a return type: <lang perl6>sub multiply (Rat $a, Rat $b --> Rat) { $a * $b }</lang> Same thing: <lang perl6>my Rat sub multiply (Rat $a, Rat $b) { $a * $b }</lang> It is possible to define a function in "lambda" notation and then bind that into a scope, in which case it works like any function: <lang perl6>my &multiply := -> $a, $b { $a * $b };</lang> Another way to write a lambda is with internal placeholder parameters: <lang perl6>my &multiply := { $^a * $^b };</lang> (And, in fact, our original @_ above is just a variadic self-declaring placeholder argument. And the famous Perl "topic", $_, is just a self-declared parameter to a unary block.)

You may also curry both built-in and user-defined operators by supplying a * (known as "whatever") in place of the argument that is not to be curried: <lang perl6>my &multiply := * * *;</lang> This is not terribly readable in this case due to the visual confusion between the whatever star and the multiplication operator, but Perl knows when it's expecting terms instead of infixes, so only the middle star is multiplication. It tends to work out much better with other operators. In particular, you may curry a cascade of methods with only the original invocant missing: <lang perl6>@list.grep( *.substr(0,1).lc.match(/<[0..9 a..f]>/) )</lang> This is equivalent to: <lang perl6>@list.grep( -> $obj { $obj.substr(0,1).lc.match(/<[0..9 a..f]>/) } )</lang>

Raven

<lang raven>define multiply use a, b

   a b *</lang>

Or optional infix: <lang raven>define multiply use a, b

   (a * b)</lang>

Or skip named vars: <lang raven>define multiply *</lang>

REALbasic

<lang vb> Function Multiply(a As Integer, b As Integer) As Integer

 Return a * b

End Function </lang>

REBOL

REBOL actually already has a function called 'multiply', which is a native compiled function. However, since it's not protected, I can easily override it: <lang REBOL>multiply: func [a b][a * b]</lang>

Relation

<lang Relation> function multiply(a,b) set result = a*b end function </lang>

Retro

<lang Retro>: multiply ( nn-n ) * ;</lang>

REXX

exactitudeness

<lang rexx>multiply: return arg(1) * arg(2) /*return the product of the two arguments.*/</lang>

cleaner display

Because REXX will return the same precision as the multiplicands, we can do some beautification with the resultant product.

I.E.:             3.0 * 4.00     yields the product:     12.000

This version eliminates the   .000   from the product. <lang rexx>multiply: return arg(1) * arg(2) / 1 /*return with a normalized product of 2 args. */</lang>

Ring

<lang ring> func multiply x,y return x*y </lang>

RLaB

In RLaB the functions can be built-in (compiled within RLaB, or part of the shared object library that is loaded per request of user), or user (written in RLaB script). Consider an example: <lang RLaB>>> class(sin) function >> type(sin) builtin</lang> Functions are a data class on their own, or they can be member of a list (associative array).

1. user function specified from built-in functions, here basic addition <lang RLaB>f = function(x, y) {

 return x + y;

};

>> class(f) function >> type(f) user</lang>

2. function can be member of a list (associative array) <lang RLaB>somelist = <<>>; somelist.f = function(x, y) {

 rval = x + y;
 return rval;

};</lang>

3. user function which uses a function that is specified as a member of some list, here we use somelist from above: <lang RLaB>g = function(x, y) {

 global(somelist);
 rval = x * somelist.f(x, 2*y);
 return rval;

};</lang>

Ruby

<lang ruby>def multiply(a, b)

   a * b

end</lang>

Rust

<lang rust>fn multiply(a: i32, b: i32) -> i32 {

   a * b

}</lang>

S-BASIC

S-BASIC is unusual in that the function return value is assigned to the END statement that terminates the function. <lang basic> function multiply(a, b = real) = real end = a * b </lang>

Sather

<lang sather>class MAIN is

 -- we cannot have "functions" (methods) outside classes
 mult(a, b:FLT):FLT is return a*b; end;
 main is
   #OUT + mult(5.2, 3.4) + "\n";
 end;

end;</lang>

Scala

<lang scala>def multiply(a: Int, b: Int) = a * b</lang>

Scheme

<lang scheme>(define multiply *)</lang> Alternately, <lang scheme>(define (multiply a b)

 (* a b))</lang>

Seed7

<lang seed7>const func float: multiply (in float: a, in float: b) is

 return a * b;</lang>

SenseTalk

<lang sensetalk>put multiply(3,7) as words

to multiply num1, num2 return num1 * num2 end multiply </lang>

Output:
twenty-one

SETL

<lang setl>proc multiply( a, b );

   return a * b;

end proc;</lang>

Sidef

<lang ruby>func multiply(a, b) {

   a * b;

}</lang>

Simula

Simula uses the term procedure for subroutines/methods whether they return a value or not. A procedure that does return a value is declared with a data type (e.g. integer procedure), whereas one that does not is declared simply as procedure. This program defines multiply as an integer procedure and illustrates its use. Note that the second argument provided to Outint gives the width of the integer to be printed. <lang simula>BEGIN

   INTEGER PROCEDURE multiply(x, y);
   INTEGER x, y;
   BEGIN
       multiply := x * y
   END;
   Outint(multiply(7,8), 2);
   Outimage

END</lang>

Slate

<lang slate>define: #multiply -> [| :a :b | a * b].</lang> or using a macro: <lang slate>define: #multiply -> #* `er.</lang> The block may also be installed as a method like so: <lang slate>a@(Number traits) multiplyBy: b@(Number traits) [a * b].</lang> or more explicitly (without sugar): <lang slate>[| :a :b | a * b] asMethod: #multipleBy: on: {Number traits. Number traits}.</lang>

Smalltalk

<lang smalltalk>|mul| mul := [ :a :b | a * b ].</lang>

SNOBOL4

<lang snobol4> define('multiply(a,b)') :(mul_end) multiply multiply = a * b  :(return) mul_end

  • Test
         output = multiply(10.1,12.2)
         output = multiply(10,12)

end</lang>

Output:
   123.22
   120

SNUSP

For expediency, the function is adding three values, instead of multiplying two values. Another function, atoi (+48) is called before printing the result. <lang snusp>+1>++2=@\=>+++3=@\==@\=.=# prints '6'

       |        |   \=itoa=@@@+@+++++#
       \=======!\==!/===?\<#
                    \>+<-/</lang>

SPARK

The function definition (multiplies two standard Integer): <lang Ada>package Functions is

  function Multiply (A, B : Integer) return Integer;
  --# pre A * B in Integer; -- See note below
  --# return A * B; -- Implies commutativity on Multiply arguments

end Functions;</lang> Note: how do you ensure then “A * B in Integer” ? Either with a proof prior to Multiply invokation or using another form of Multiply where input A and B would be restricted to a range which ensures the resulting product is always valid. Exemple : <lang Ada>type Input_Type is range 0 .. 10; type Result_Type is range 0 .. 100;</lang> and had a version of Multiply using these types. On the other hand, if arguments of Multiply are constants, this is provable straight away.

The Multiply's implementation: <lang Ada>package body Functions is

  function Multiply (A, B : Integer) return Integer is
  begin
     return A * B;
  end Multiply;

end Functions;</lang>

SPL

Single-line function definition: <lang spl>multiply(a,b) <= a*b</lang> Multi-line function definition: <lang spl>multiply(a,b)=

 x = a*b
 <= x

.</lang>

SSEM

The SSEM instruction set makes no explicit provision for subroutines, and indeed its storage space is too small for them to be of much use; but something like a subroutine can be created using a modified form of Wheeler jump. In this technique, the jump to the subroutine is accomplished with the return address loaded in the accumulator. The first action by the subroutine is to store this address in a place where it will be found by its own final jump instruction. In principle, therefore, the subroutine can be called multiple times from different points in the program without the calling routine needing to modify it at all (or even to know anything about it beyond where it begins, where it expects to find its parameters, and where it will store its result or results).

In this example, the main routine does nothing at all beyond calling the subroutine and halting after it has returned. The values A and B are passed in the two addresses located immediately before the subroutine begins; their product is returned in the address that formerly stored A. Given that the multiply subroutine begins at address 8, the calling routine looks like this: <lang ssem>01000000000000100000000000000000 0. -2 to c 00100000000000000000000000000000 1. 4 to CI 01111111111111111111111111111111 2. -2 00000000000001110000000000000000 3. Stop 11100000000000000000000000000000 4. 7</lang> or in pseudocode:

          load       &here
          jump       multiply
here:     halt

Implementing multiply on the SSEM requires the use of repeated negation and subtraction. For the sake of example, the values 8 and 7 are provided for A and B. <lang ssem>00010000000000000000000000000000 6. 8 11100000000000000000000000000000 7. 7 11111000000001100000000000000000 8. c to 31 01100000000000100000000000000000 9. -6 to c 01111000000001100000000000000000 10. c to 30 01111000000000100000000000000000 11. -30 to c 01111000000001100000000000000000 12. c to 30 11100000000000100000000000000000 13. -7 to c 11100000000001100000000000000000 14. c to 7 11100000000000100000000000000000 15. -7 to c 00111000000000010000000000000000 16. Sub. 28 11100000000001100000000000000000 17. c to 7 00111000000000010000000000000000 18. Sub. 28 00000000000000110000000000000000 19. Test 00111000000001000000000000000000 20. Add 28 to CI 11111000000000000000000000000000 21. 31 to CI 01100000000000100000000000000000 22. -6 to c 01111000000000010000000000000000 23. Sub. 30 01100000000001100000000000000000 24. c to 6 01100000000000100000000000000000 25. -6 to c 01100000000001100000000000000000 26. c to 6 10111000000000000000000000000000 27. 29 to CI 10000000000000000000000000000000 28. 1 00110000000000000000000000000000 29. 12 00000000000000000000000000000000 30. 0 00000000000000000000000000000000 31. 0</lang> The pseudocode equivalent clarifies how the subroutine works, or how it would work on an architecture that supported load and add:

a:        equals     #8
b:        equals     #7
multiply: store      ret
          load       a
          store      n
loop:     load       b
          sub        #1
          store      b
          sub        #1
          ifNegative done
          load       a
          add        n
          store      a
          jump       loop
done:     jump       *ret
n:        reserve    1 word
ret:      reserve    1 word

Standard ML

<lang ocaml>val multiply = op *</lang> Equivalently, <lang ocaml>fun multiply (x, y) = x * y</lang> Using lambda syntax: <lang sml>val multiply = fn (x, y) => x * y</lang> Curried form: <lang ocaml>fun multiply x y = x * y</lang>

Stata

Ado

Stata's macro language does not have functions, but commands. Output is usually saved as a "stored result" (but could also be saved in a global macro variable, in a scalar or matrix, in a dataset or simply printed to the Results window). See program and [1] in Stata documentation.

<lang stata>prog def multiply, return args a b return sca product=`a'*`b' end

multiply 77 13 di r(product)</lang>

Output

1001

Mata

Mata is the matrix language of Stata. Here is how to define a function

<lang stata>mata scalar multiply(scalar x, scalar y) { return(x*y) }

multiply(77,13) end</lang>

Output

1001

Swift

<lang swift>func multiply(a: Double, b: Double) -> Double {

  return a * b

}</lang>

Tcl

Strictly as described in the task: <lang tcl>proc multiply { arg1 arg2 } {

   return [expr {$arg1 * $arg2}]

}</lang>

Works with: Tcl version 8.5

You can also create functions that work directly inside expressions. This is done by creating the command with the correct name (that is, in the tcl::mathfunc namespace): <lang tcl>proc tcl::mathfunc::multiply {arg1 arg2} {

   return [expr {$arg1 * $arg2}]

}

  1. Demonstrating...

if {multiply(6, 9) == 42} {

   puts "Welcome, Citizens of Golgafrincham from the B-Ark!"

}</lang>

TI-89 BASIC

<lang ti89b>multiply(a, b) Func

 Return a * b

EndFunc</lang>

Toka

<lang toka>[ ( ab-c ) * ] is multiply</lang>

Transd

<lang scheme>multiply: (lambda a Double() b Double() (* a b))</lang>

TXR

In TXR, there are pattern functions which are predicates that perform pattern matching and variable capture. A call to this type of function call can specify unbound variables. If the function succeeds, it can establish bindings for those variables.

Here is how to make a pattern function that multiplies, and call it. To multiply the numbers, we break out of the pattern language and invoke Lisp evaluation: @(* a b) <lang txr>@(define multiply (a b out)) @(bind out @(* a b)) @(end) @(multiply 3 4 result)</lang>

$ txr -B multiply.txr
result="12"

In the embedded Lisp dialect, it is possible to write an ordinary function that returns a value: <lang txrlisp>(defun mult (a b) (* a b))

 (put-line `3 * 4 = @(mult 3 4)`)</lang>
$ txr multiply.tl
3 * 4 = 12

uBasic/4tH

In uBasic you can turn any subroutine into a function with the FUNC() function. It takes one argument, which is the label. Arguments are optional. <lang>PRINT FUNC (_Multiply (2,3)) END

_Multiply PARAM (2) RETURN (a@ * b@)</lang>

UNIX Shell

Note that in the Unix shell, function definitions do not include any argument specifications within the parentheses. Instead arguments to functions are obtained using the positional parameters.

Works with: Bourne Shell

<lang bash>multiply() {

 # There is never anything between the parentheses after the function name
 # Arguments are obtained using the positional parameters $1, and $2
 # The return is given as a parameter to the return command
 return `expr "$1" \* "$2"`    # The backslash is required to suppress interpolation

}

  1. Call the function

multiply 3 4 # The function is invoked in statement context echo $? # The dollarhook special variable gives the return value</lang>

Works with: Bash

return an exit code <lang bash>multiply() {

 return $(($1 * $2))

}

multiply 5 6 echo $?</lang> echo the result <lang bash>multiply() {

 echo -n $(($1 * $2))

}

echo $(multiply 5 6)</lang>

Ursa

<lang ursa># multiply is a built-in in ursa, so the function is called mult instead def mult (int a, int b) return (* a b) end</lang>

Ursala

Functions are declared with an equals sign like constants of any other type. They may be specified by lambda abstraction, with dummy variables in double quotes, or in point-free form, or any combination. The way multiplication is defined depends on the type of numbers being multiplied. For this example, numbers in standard IEEE double precision are assumed, and the multiply function is defined in terms of the system library function, called using the syntax math..mul. This is the definition in point free form, <lang Ursala>multiply = math..mul</lang> this is the definition using lambda abstraction <lang Ursala>multiply = ("a","b"). math..mul ("a","b")</lang> and this is the definition using pattern matching. <lang Ursala>multiply("a","b") = math..mul ("a","b")</lang>

V

V uses stack for input arguments and '.' is a word that takes a quote and binds the first word to the sequence of actions supplied in the quote. <lang v>[multiply *].</lang> Using it <lang v>2 3 multiply =6</lang> V also allows internal bindings. <lang v>[multiply

 [a b] let
 a b *].</lang>

VBA

<lang vb>Function Multiply(lngMcand As Long, lngMplier As Long) As Long

   Multiply = lngMcand * lngMplier

End Function</lang> To use this function : <lang vb>Sub Main() Dim Result As Long

   Result = Multiply(564231, 897)

End Sub</lang>

VBScript

<lang vb>function multiply( multiplicand, multiplier )

   multiply = multiplicand * multiplier

end function</lang> Usage: <lang vb>dim twosquared twosquared = multiply(2, 2)</lang>

Visual Basic

Works with: Visual Basic version VB6 Standard

<lang vb> Function multiply(a As Integer, b As Integer) As Integer

   multiply = a * b

End Function </lang> Call the function <lang vb>Multiply(6, 111)</lang>

Visual Basic .NET

<lang vbnet>Function Multiply(ByVal a As Integer, ByVal b As Integer) As Integer

   Return a * b

End Function</lang> Call the function <lang vbnet>Multiply(1, 1)</lang>

Wart

A straightforward way to say how calls of the form (multiply a b) are translated: <lang python>def (multiply a b)

 a*b</lang>

<lang python>(multiply 3 4) => 12</lang>

Functions can also use keyword args.

<lang python>(multiply 3 :a 4) # arg order doesn't matter here, but try subtract instead => 12</lang>

Finally, we can give parameters better keyword args using aliases:

<lang python>def (multiply a b|by)

 (* a b)</lang>

<lang python>multiply 3 :by 4 => 12</lang>

WebAssembly

   (func $multipy (param $a i32) (param $b i32) (result i32)
       local.get $a
       local.get $b
       i32.mul
   )

Wren

The following 'multiply' function will work for any type(s) that support the '*' operator. However, it will produce a runtime error otherwise, as demonstrated by the final example. <lang ecmascript>var multiply = Fn.new { |a, b| a * b }

System.print(multiply.call(3, 7)) System.print(multiply.call("abc", 3)) System.print(multiply.call([1], 5)) System.print(multiply.call(true, false))</lang>

Output:
21
abcabcabc
[1, 1, 1, 1, 1]
Bool does not implement '*(_)'.
[./function_definition line 1] in new(_) block argument
[./function_definition line 6] in (script)

X86 Assembly

X86 Assembly doesn't really have functions. Instead, it has labels that are called. Function arguments can be pushed onto the stack prior to calling or passed to the function in registers. The system will usually have some sort of calling conventions to facilitate inter-operation between languages.

Unix

Function definition and calling conventions on a Unix-like system are specified in the book "System V Application Binary Interface: Intel 386 Architecture Processor Supplement" (from SCO at archive.org). These are the conventions used by the C language and also most other languages.

The stack, for two 32-bit integer parameters, is

  • [esp+8] second parameter
  • [esp+4] first parameter
  • [esp] return address

The return value is left in the eax register. ecx and edx are "scratch" registers meaning the called routine doesn't need to preserve their values. (In the code below edx is clobbered.)

The following is Unix-style "as" assembler syntax (including GNU as). The resulting function can be called from C with multiply(123,456).

<lang asm> .text

       .globl  multiply
       .type   multiply,@function

multiply:

       movl    4(%esp), %eax
       mull    8(%esp)
       ret</lang>

The .type directive is important for code which will go into a shared library. You can get away without it for a static link. It ensures the linker knows to dispatch calls from the mainline to the function via a PLT entry. (If omitted the code is copied at runtime into some mainline space. Without a .size directive only 4 bytes will be copied.)

NASM

Works with: NASM

<lang asm>section .text global _start

_multiply_regs:

 mul ebx
 mov eax, ebx
 ret

_multiply_stack:

 enter 2,0
 mov eax, [esp+4]
 mov ebx, [esp+8]
 mul ebx
 mov eax, ebx 
 leave
 ret

_start:

 mov ax, 6  ;The number to multiply by
 mov ebx, 16 ;base number to multiply.
 call _multiply_regs
 push 6
 push 16
 call _multiply_stack</lang>

MASM

However, in MASM we do have function statements due to the preprocessor.

Works with: MASM

<lang asm>multiply proc arg1:dword, arg2:dword

 mov eax, arg1
 mov ebx, arg2
 mul ebx
 mov eax, ebx
 ret

multiply endp</lang> Then to call it. <lang asm>invoke multiply, 6, 16

or..

push 16 push 6 call multiply</lang> Return values are usually put into the register EAX. This, of course is not a must it's simply that it's somewhat of a unofficial standard. For example, C/C++ preprocessors/compilers will translate "return value" into "mov eax, value" followed by the return to caller instruction "ret".

XBS

Functions are defined by using the func keyword. <lang XBS>func multiply(a,b){ send a*b; }</lang>

XLISP

Functions can be defined using either 'classic' Lisp syntax: <lang lisp>(defun multiply (x y)

   (* x y))</lang>

or Scheme-style syntax: <lang scheme>(define (multiply x y)

   (* x y))</lang>

or, if you prefer, with LAMBDA: <lang scheme>(define multiply

   (lambda (x y) (* x y)))</lang>

Xojo

<lang vbnet>Function Multiply(ByVal a As Integer, ByVal b As Integer) As Integer

   Return a * b

End Function</lang> Call the function <lang vbnet>Dim I As Integer = Multiply(7, 6)</lang>

XPL0

<lang XPL0>func Multiply(A, B); \the characters in parentheses are only a comment int A, B; \the arguments are actually declared here, as integers return A*B; \the default (undeclared) function type is integer

                       \no need to enclose a single statement in brackets

func real FloatMul(A, B); \floating point version real A, B; \arguments are declared here as floating point (doubles) return A*B;</lang>

XSLT

Templates are the closest things XSLT has to user defined functions. They can be declared to be called by name and/or to be applied to all nodes in a matching set and given "mode". Both types of template can take named parameters with default values. Templates also have a "context" node used as the base of XPath expressions (kind of like an implied "this" of an object's method). <lang xslt><xsl:template name="multiply">

 <xsl:param name="a" select="2"/>
 <xsl:param name="b" select="3"/>
 <xsl:value-of select="$a * $b"/>

</xsl:template></lang> Usage examples. <lang xslt><xsl:call-template name="multiply">

 <xsl:with-param name="a">4</xsl:with-param>
 <xsl:with-param name="b">5</xsl:with-param>

</xsl:call-template>

<xsl:call-template name="multiply"/> <-- using default parameters of 2 and 3 --></lang>

Available in XSLT 2.0 and later versions. <lang xslt><xsl:function name="mf:multiply">

   <xsl:param name="a"/>
   <xsl:param name="b"/>
   <xsl:value-of select="$a * $b"/>

</xsl:function></lang> Usage examples. <lang xslt>{mf:multiply(2,3)} <xsl:value-of select="mf:multiply(2,3)" /></lang>

Yorick

<lang yorick>func multiply(x, y) {

   return x * y;

}</lang> Example of interactive usage:

> multiply(2, 4.5)
9

Z80 Assembly

A function's return values are whatever registers or memory are changed by the function. A good programmer will explain what is returned where by using comments.

<lang z80>doMultiply:

returns HL = HL times A. No overflow protection.

push bc push de

   rrca                     ;test if A is odd or even by dividing A by 2.
   jr c, isOdd
       ;is even
       ld b,a

loop_multiplyByEvenNumber:

       add hl,hl           ;double A until B runs out.
       djnz loop_multiplyByEvenNumber

pop de pop bc ret

isOdd:

   push hl
   pop de                  ;de contains original HL. We'll need it later.
   ld b,a

loop_multiplyByOddNumber:

   add hl,hl
   djnz loop_multiplyByOddNumber
   add hl,de             ;now add in original HL for the leftover add.

pop de pop bc ret</lang>

zkl

<lang zkl>fcn multiply(x,y){x*y}</lang> <lang zkl>fcn(x,y){x*y}(4.5,3) // --> 13.5</lang> Since all functions are vararg:<lang zkl>fcn multiply{vm.arglist.reduce('*)} multiply(1,2,3,4,5) //--> 120</lang> Operators are first class objects so:<lang zkl>var mul=Op("*"); mul(4,5) //-->20</lang>

ZX Spectrum Basic

On the ZX Spectrum, function names are limited to one letter. Note that the function becomes effective as soon as it is entered into the program, and does not need to be run <lang zxbasic>10 PRINT FN m(3,4): REM call our function to produce a value of 12 20 STOP 9950 DEF FN m(a,b)=a*b</lang>