Κατά τη μεταβίβαση συναρτήσεων σε άλλες συναρτήσεις, η κανονική εμβέλεια των μεταβλητών μπορεί να είναι ανεπιθύμητη. Για παράδειγμα:
k := 10; function r(x) = (x+k); function f(g,x) = ( k := 5; g(x) ); f(r,1)
προφανώς θέλετε η συνάρτηση r
κατά τη μεταβίβαση ως g
στη f
να δει τη k
ως 10 αντί για 5, έτσι ώστε ο κώδικας να επιστρέψει 11 και όχι 6. Όμως, όπως είναι γραμμένο, η συνάρτηση κατά την εκτέλεση θα δει τη k
που είναι ίση με 5. Υπάρχουν δύο τρόποι για την επίλυση αυτού του θέματος. Κάποιος πρέπει να κάνει την r
να πάρει την k
σε ένα ιδιωτικό λεξικό χρησιμοποιώντας την σημειογραφία αγκύλης στην ενότητα Επιστροφή συναρτήσεων.
But there is another solution. Since version 1.0.7 there are
true local variables. These are variables that are visible only
from the current context and not from any called functions.
We could define k
as a local variable in the
function f
. To do this add a
local statement as the first statement in the
function (it must always be the first statement in the function).
You can also make any arguments be local variables as well.
That is,
function f(g,x) = ( local g,x,k; k := 5; g(x) );
Then the code will work as expected and prints out 11.
Note that the local statement initializes
all the referenced variables (except for function arguments) to
a null
.
If all variables are to be created as locals you can just pass an
asterisk instead of a list of variables. In this case the variables
will not be initialized until they are actually set of course.
So the following definition of f
will also work:
function f(g,x) = ( local *; k := 5; g(x) );
Είναι μια καλή πρακτική όλες οι συναρτήσεις που παίρνουν άλλες συναρτήσεις ως ορίσματα να χρησιμοποιούν τοπικές μεταβλητές. Με αυτόν το τρόπο η μεταβιβαζόμενη συνάρτηση δεν βλέπει λεπτομέρειες υλοποίησης και δεν μπερδεύεται.