1010 IF n<0 OR n<> INT n THEN
PRINT "Factorial only
possible for 0 or positive
integers":ENDPROC =
-1:ELSE IF (n = 0 OR n=1)
THEN ENDPROC =1
1020 LOCAL partial
1030 PROC factorial(n-1) TO
partial
1040 ENDPROC =n*partial
Apart from being a good example of recursion2 we can see how this procedure feeds itself the results of the previous iteration via the local variable partial. Each iteration reduces the value by 1 as evidenced in line 1030. There's an obvious extra iteration that could be skipped when n becomes 1 but it's not important for the purpose of this example.
When calling a procedure with the PROC ... TO... version of the PROC keyword, ENDPROC must use the optional form ENDPROC =result1... and have as many results returned (separated by commas) as the calling PROC requested. PROC may be called without a TO or with a partial list of the result variables returned by ENDPROC but the inverse cannot happen and will return error Q Parameter error. For example this program:
10 product = 0
20 PROC mul(3) TO product
30 PRINT product
40 STOP
50 DEFPROC mul(x)
60 LOCAL a
80 a=x*2
90 ENDPROC =a
will return 6 when run. When we change line 20 to read:
20 PROC mul(3)
it will return 0 as variable product hasn't been changed from its initial assignment, however if we return line 20 to its original form and change line 70 to:
70 ENDPROC
then execution of the program will produce a Q Parameter error.
Normally calling a procedure with parameters is done by value: this means that the value of the parameter is passed on to the procedure and any changes that occur are invisible to the caller. Passing by reference on the other hand lets the caller be aware of the changes.
This is mainly intended for arrays, as the default (by value) will be slower and more memory intensive, but it can also be useful for strings. Numeric variables, are faster if passed by value so passing them by reference is not recommended. To make a parameter a reference we use the REF keyword within the DEFPROC parameter block; such parameters must be passed by the calling PROC as a variable or array name only. It is not permitted to have default values for REFerenced parameters. For example:
2 The ability of the code to call itself
ZX Spectrum Next User Manual, 3rd Edition (ISBN 978-1-5272-5496-1), written and illustrated by Phoebus R. Dokos. Copyright © 2020-2024 Phoebus Dokos / SpecNext Ltd. Licensed under CC BY-NC-SA 4.0. This is a transcription and can contain errors; check any doubt against the printed page.