Call a function: Difference between revisions
Content deleted Content added
Mercerenies (talk | contribs) Latitude language added |
→version 1: added more comments, changed some comments, added whitespace and indentation of boxed comments, created separate program elements, aligned structures and statements. |
||
Line 4,369:
=={{header|REXX}}==
===version 1===
<lang rexx>/*REXX
/*╔════════════════════════════════════════════════════════════════════╗
║ ║
║ 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 ║
╚════════════════════════════════════════════════════════════════════╝*/
yr= yearFunc() /*the function name is caseless if it isn't */
/*enclosed in quotes (') or apostrophes (").*/
say 'year=' yr
exit /*stick a fork in it, we're all done. */
yearFunc: procedure /*function ARG returns the # of args.*/
errmsg= '***error***' /*an error message eyecatcher string. */
if arg() \== 0 then say errmsg
return left( date('Sorted'),
<lang rexx> /*╔════════════════════════════════════════════════════════════════════╗
║ 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). ║
║ In some languages, these are known as "generic" functions. ║
╚════════════════════════════════════════════════════════════════════╝*/
ggg= FourFunc(12, abc, 6+q, zz%2, 'da 5th disagreement')
say 'ggg squared=' ggg**2
exit /*stick a fork in it, we're all done. */
FourFunc: procedure; parse arg a1,a2,a3 /*obtain the first three arguments. */
a4= arg(4) /*another way to obtain the 4th arg. */
errmsg= '***error***' /*an error message eyecatcher string. */
if arg() \== 4 then do
exit 13 /*exit function with a RC of 13*/
return a1 + a2 + a3 + a4</lang>
<lang rexx> /*╔════════════════════════════════════════════════════════════════════╗
║ 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 five args, the 4th arg is "null"*/
exit /*stick a fork in it, we're all done. */
SumIt: procedure
$= 0 /*initialize the sum to zero. */
do j=1 for arg() /*obtain the sum of a number of args. */
if arg(j,'E') then $= $ + arg(j) /*the Jth arg may have been omitted. */
end /*j*/
return $</lang>
<lang rexx> /*╔════════════════════════════════════════════════════════════════════╗
║ 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 /*stick a fork in it, we're all done. */
parseFunc: procedure expose common.
do j=1 for arg()
parse var arg(j) name '=' val
upper name /*uppercase it.*/
call value 'COMMON.'name,val
end
return arg()</lang>
<lang rexx> /*╔════════════════════════════════════════════════════════════════════╗
║ 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 /*stick a fork in it, we're all done. */</lang>
<lang rexx> /*╔════════════════════════════════════════════════════════════════════╗
║ ║
║ There are 2 ways to get the (return) value (RESULT) of a function. ║
╚════════════════════════════════════════════════════════════════════╝*/
currYear= yearFunc()
say 'the current year is' currYear
call yearFunc
say 'the current year is' result /*result can be RESULT, it is caseless.*/</lang>
<lang rexx> /*╔════════════════════════════════════════════════════════════════════╗
║ 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 ║
╚════════════════════════════════════════════════════════════════════╝*/
qqq= date() /*number of real dates that Bob was on.*/
/*hopefully, it accurately counts dates*/
say "Bob's been out" qqq 'times.'
www= 'DATE'("USA") /*returns date in format mm/dd/yyyy */
/*any function in quotes is external. */
exit /*stick a fork in it, we're all done. */
date: return 4 /*Bob only "went out" 4 times, no need */
/* to actually count, he quit after 4. */</lang>
<lang rexx> /*╔════════════════════════════════════════════════════════════════════╗
║ Distinguishing subroutines and functions. ║
║ ║
║ There is no programmatic 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 ║
║ 1. The "syntactic sugar" that allows one to write some examples ║
║ are: map (f 1 9) [1..9] ║
║ or: map (f(1,_,9)) [1, ..., 9] ║
╚════════════════════════════════════════════════════════════════════╝*/</lang>
===version 2===
|