Call a function: Difference between revisions
Content added Content deleted
(partial application) |
(→{{header|REXX}}: added the REXX language. -- ~~~~) |
||
Line 436: | Line 436: | ||
<lang PicoLisp>(setq A (+ 3 4) B (* 3 4))</lang> |
<lang PicoLisp>(setq A (+ 3 4) B (* 3 4))</lang> |
||
i.e. the first argument 'A' is not evaluated, the second evaluates to 7, 'B' is not evaluated, then the fourth evaluates to 12. |
i.e. the first argument 'A' is not evaluated, the second evaluates to 7, 'B' is not evaluated, then the fourth evaluates to 12. |
||
=={{header|REXX}}== |
|||
<lang rexx> |
|||
/*REXX program to demonstrate various methods of calling a REXX function*/ |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Calling a function that REQUIRES no arguments. │ |
|||
│ │ |
|||
│ In the REXX language, there is no way to require the caller to not │ |
|||
│ pass arguments, but the programmer can check if any arguments were │ |
|||
│ (or weren't) passed. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
yr=yearFunc() |
|||
say 'year=' yr |
|||
exit |
|||
yearFunc: procedure |
|||
if arg()\==0 then call sayErr "SomeFunc function won't accept arguments." |
|||
return left(date('Sorted'),3) |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Calling a function with a fixed number of arguments. │ |
|||
│ │ |
|||
│ I take this to mean that the function requires a fixed number of │ |
|||
│ arguments. As above, REXX doesn't enforce calling (or invoking) │ |
|||
│ a (any) function with a certain number of arguments, but the │ |
|||
│ programmer can check if the correct number of arguments have been │ |
|||
│ specified (or not). │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
ggg=FourFunc(12,abc,6+q,zz%2,'da 5th disagreement') |
|||
say 'ggg squared=' ggg**2 |
|||
exit |
|||
FourFunc: procedure; parse arg a1,a2,a3; a4=arg(4) /*another way get a4*/ |
|||
if arg()\==4 then do |
|||
call sayErr "FourFunc function requires 4 arguments," |
|||
call sayErr "but instead it found" arg() 'arguments.' |
|||
exit 13 |
|||
end |
|||
return a1+a2+a3+a4 |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Calling a function with optional arguments. │ |
|||
│ │ |
|||
│ Note that not passing an argument isn't the same as passing a null │ |
|||
│ argument (a REXX variable whose value is length zero). │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
x=12; w=x/2; y=x**2; z=x//7 /* z is x modulo seven.*/ |
|||
say 'sum of w, x, y, & z=' SumIt(w,x,y,,z) /*pass 5 args, 4th is null*/ |
|||
exit |
|||
SumIt: procedure; sum=0 |
|||
do j=1 for arg() |
|||
if arg(j,'E') then sum=sum+arg(j) /*the Jth arg may have been omitted*/ |
|||
end |
|||
return sum |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Calling a function with a variable number of arguments. │ |
|||
│ │ |
|||
│ This situation isn't any different then the previous example. │ |
|||
│ It's up to the programmer to code how to utilize the arguments. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Calling a function with named arguments. │ |
|||
│ │ |
|||
│ REXX allows almost anything to be passed, so the following is one │ |
|||
│ way this can be accomplished. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
what=parserFunc('name=Luna',"gravity=.1654",'moon=yes') |
|||
say 'name=' common.name |
|||
gr=common.gr |
|||
say 'gravity=' gr |
|||
exit |
|||
parseFunc: procedure expose common. |
|||
do j=1 for arg() |
|||
parse var arg(j) name '=' val |
|||
upper name |
|||
call value 'COMMON.'name,val |
|||
end |
|||
return arg() |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Calling a function in statement context. │ |
|||
│ │ |
|||
│ REXX allows functions to be called (invoked) two ways, the first │ |
|||
│ example (above) is calling a function in statement context. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Calling a function in within an expression. │ |
|||
│ │ |
|||
│ This is a variant of the first example. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
yr=yearFunc()+20 |
|||
say 'two decades from now, the year will be:' yr |
|||
exit |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Obtaining the return value of a function. │ |
|||
│ │ |
|||
│ There are two ways to get the (return) value of a function. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
currYear=yearFunc() |
|||
say 'the current year is' currYear |
|||
call yearFunc |
|||
say 'the current year is' result |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Distinguishing built-in functions and user-defined functions. │ |
|||
│ │ |
|||
│ One objective of the REXX language is to allow the user to use any │ |
|||
│ function (or subroutine) name whether or not there is a built-in │ |
|||
│ function with the same name (there isn't a penality for this). │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
qqq=date() /*number of real dates that Bob was on. */ |
|||
say "Bob's been out" qqq 'times.' |
|||
www='DATE'('USA') /*returns date in format mm/dd/yyy */ |
|||
exit /*any function in quotes is external. */ |
|||
date: return 4 |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ Distinguishing subroutines and functions. │ |
|||
│ │ |
|||
│ There is no programatic difference between subroutines and │ |
|||
│ functions if the subroutine returns a value (which effectively │ |
|||
│ makes it a function). REXX allows you to call a function as if │ |
|||
│ it were a subroutine. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ In REXX, all arguments are passed by value, never by name, but it │ |
|||
│ is possible to accomplish this if the variable's name is passed │ |
|||
│ and the subroutine/function could use the built-in-function VALUE │ |
|||
│ to retrieve the variable's value. │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
/*┌────────────────────────────────────────────────────────────────────┐ |
|||
│ In the REXX language, partial application is possible, depending │ |
|||
│ how partial application is defined; I prefer the 1st definition (as│ |
|||
│ (as per the "discussion" for "Partial Function Application" task: │ |
|||
│ 1. The "syntactic sugar" that allows one to write (some examples│ |
|||
│ are: map (f 7 9) [1..9] │ |
|||
│ or: map(f(7,_,9),{1,...,9}) │ |
|||
└────────────────────────────────────────────────────────────────────┘*/ |
|||
</lang> |
|||
=={{header|Tcl}}== |
=={{header|Tcl}}== |