Function prototype: Difference between revisions

→‎{{header|SNOBOL4}}: Added explanatory section headers and clarified the example.
m (Oops. Screwed up the wiki formatting.)
(→‎{{header|SNOBOL4}}: Added explanatory section headers and clarified the example.)
Line 847:
In SNOBOL4, functions are actually a hack and are defined in an idiosyncratic way that is simultaneously like a prototype or not like one as the case may be.
 
===Basics===
To begin with, we look at the definition provided [http://rosettacode.org/wiki/Function_definition#SNOBOL4 at the relevant task page]:
 
Line 861 ⟶ 862:
 
On execution, the SNOBOL4 runtime will execute line by line of the script. When it reaches the <code>define</code> BIF call it will do the stuff it needs to do behind the scenes to set up function-like access to the <code>multiply</code> branch target. It would then proceed to execute the next line were it not for the branch.
 
===Separation of prototype and body===
 
Of course this implies that you can separate the two pieces. Which you can, like this:
Line 887 ⟶ 890:
 
With this structure the "function" is declared at the program, the implementation is somewhere down in the middle, and the mainline (<code>test</code> here) is at the end.
 
===Full prototyping===
 
The <code>define()</code> BIF is used for more than merely providing function-like access to a label with the same name. It is used to prototype all of these (with some default behaviour):
Line 892 ⟶ 897:
* the function name (<code>multiply</code> in the examples);
* the formal arguments to the function (<code>a, b</code> in the examples);
* the entry point label for the function's code (defaults to the function name, <code>mult_impl</code> in the following example);
* any local variables which should be protected in the function (defaults to none, <code>acc1,acc2</code> in the following example).
 
Thus a highly-contrived example function that illustrates all of these would look like this: