GEL is a dynamically scoped language. We will explain what this means below. That is, normal variables and functions are dynamically scoped. The exception are parameter variables, which are always global.
Όπως οι περισσότερες γλώσσες προγραμματισμού, η GEL έχει διαφορετικούς τύπους μεταβλητών. Κανονικά, όταν μια μεταβλητή ορίζεται σε μια συνάρτηση, είναι ορατή από αυτή τη συνάρτηση και από όλες τις συναρτήσεις που καλούνται (όλες με υψηλότερα περιεχόμενα). Για παράδειγμα, ας υποθέσουμε ότι μια συνάρτηση f
ορίζει μια μεταβλητή a
και έπειτα καλεί τη συνάρτηση g
. Τότε η συνάρτηση g
μπορεί να αναφέρει την a
. Αλλά μόλις η f
επιστρέφει, η μεταβλητή a
βγαίνει εκτός εμβέλειας. Για παράδειγμα, ο παρακάτω κώδικας θα εμφανίσει 5. Η συνάρτηση g
δεν μπορεί να κληθεί στο ανώτατο επίπεδο (έξω από τη f
ως a
δεν θα οριστεί).
function f() = (a:=5; g()); function g() = print(a); f();
Αν ορίσετε μια μεταβλητή μέσα σε μια συνάρτηση θα επικαλύψει οποιεσδήποτε μεταβλητές ορίστηκαν στις συναρτήσεις κλήσης. Για παράδειγμα, τροποποιούμε τον παραπάνω κώδικα και γράφουμε:
function f() = (a:=5; g()); function g() = print(a); a:=10; f();
Αυτός ο κώδικας θα εμφανίσει ακόμα 5. Αλλά αν καλέσετε την g
έξω από την f
, τότε θα πάρετε ένα αποτέλεσμα 10. Σημειώστε ότι, ο ορισμός μιας a
σε 5 μέσα σε μια f
δεν αλλάζει την τιμή της a
στο ανώτατο (καθολικό) επίπεδο, έτσι αν τώρα ελέγξετε την τιμή της a
θα είναι ακόμα 10.
Τα ορίσματα συναρτήσεων είναι ακριβώς όπως οι μεταβλητές που ορίστηκαν μέσα στη συνάρτηση, εκτός από το ότι είναι αρχικοποιημένες με την τιμή που περάστηκε στη συνάρτηση. Πέρα από αυτό το σημείο, αντιμετωπίζονται ακριβώς όπως όλες οι άλλες μεταβλητές που ορίστηκαν μέσα στη συνάρτηση.
Οι συναρτήσεις αντιμετωπίζονται ακριβώς όπως οι μεταβλητές. Συνεπώς, μπορείτε τοπικά να επανορίσετε τις συναρτήσεις. Κανονικά, (στο ανώτατο επίπεδο) δεν μπορείτε να επανορίσετε προστατευμένες μεταβλητές και συναρτήσεις. Αλλά τοπικά μπορείτε να το κάνετε. Θεωρείστε την ακόλουθη συνεδρία:
genius>
function f(x) = sin(x)^2
= (`(x)=(sin(x)^2))genius>
function f(x) = sin(x)^2
= (`(x)=(sin(x)^2))genius>
function g(x) = ((function sin(x)=x^10);f(x))
= (`(x)=((sin:=(`(x)=(x^10)));f(x)))genius>
g(10)
= 1e20
Functions and variables defined at the top level are
considered global. They are visible from anywhere. As we
said the following function f
will not change the value of a
to 5.
a=6; function f() = (a:=5); f();
Sometimes, however, it is necessary to set
a global variable from inside a function. When this behavior is needed,
use the
set
function. Passing a string or a quoted identifier to
this function sets the variable globally (on the top level).
For example, to set
a
to the value 3 you could call:
set(`a,3)
or:
set("a",3)
Η συνάρτηση set
ορίζει πάντα την καθολική ανωτάτου επιπέδου. Δεν υπάρχει τρόπος να οριστεί μια τοπική μεταβλητή σε κάποια συνάρτηση από μια υπορουτίνα. Αν αυτό απαιτείται, πρέπει να χρησιμοποιηθεί το πέρασμα με αναφορά.
See also the
SetElement
and
SetVElement
functions.
Για να ανακεφαλαιώσουμε σε μια πιο τεχνική γλώσσα: Η Genius λειτουργεί με διαφορετικά αριθμημένα περιεχόμενα. Το ανώτατο επίπεδο είναι το περιεχόμενο 0 (μηδέν). Όποτε μια συνάρτηση εισέρχεται, το περιεχόμενο αυξάνεται και όταν η συνάρτηση επιστρέφει το περιεχόμενο μειώνεται. Μια συνάρτηση ή μια μεταβλητή είναι πάντα ορατή από όλα τα περιεχόμενα με υψηλότερη αρίθμηση. Όταν μια μεταβλητή ορίζεται σε ένα περιεχόμενο χαμηλότερης αρίθμησης, τότε ο ορισμός αυτής της μεταβλητής επιδρά στη δημιουργία μιας νέας τοπικής μεταβλητής με τον τρέχοντα αριθμό περιεχομένου και αυτή η μεταβλητή θα είναι τώρα ορατή από όλα τα περιεχόμενα με υψηλότερη αρίθμηση.
Υπάρχουν επίσης αληθινές τοπικές μεταβλητές, που δεν φαίνονται από οπουδήποτε εκτός από το τρέχον περιεχόμενο. Επίσης όταν επιστρέφονται συναρτήσεις με τιμή μπορεί να αναφέρονται σε μεταβλητές μη ορατές από υψηλότερο περιεχόμενο και αυτό μπορεί να είναι ένα πρόβλημα. Δείτε τις ενότητες Αληθείς τοπικές μεταβλητές και Επιστροφή συναρτήσεων.