Μεταγλώσσα, μεταλογική και μεταπρογραμματισμός
Ήθελα να προγραμματίσω στην python την εντολή struct του matlab, η οποία λειτουργεί ως εξής:
a = struct('x', 1, 'y', [1,2], 'z', zeros(2))
και δημιουρργεί μια τέτοια δομή:
a =
x: 1
y: [1 2]
z: [2x2 double]
και μετά είναι δυνατό να γράψουμε:
a.id = 1
Μετά από μια χρονοβόρα αναζήτηση σε εγχειρίδια της python, σε online documentation και στο διαδίκτυο γενικότερα, οδηγήθηκα στη λέξη μεταπρογραμματισμός, και συνειρμικά φυσικά θυμήθηκα τις λέξεις μεταγλώσσα και μεταλογική. Στη γλώσσα χρησιμοποιούμε προτάσεις 'ένα συν ένα κάνει δύο' αλλά και 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής'. Στην πραγματικότητα οι δύο αυτοί τύποι προτάσεων ανήκουν σε δύο διαφορετικές γλώσσες. Η μία είναι η γλώσσα που περιέχει ένα σύνολο προτάσεων---δυνατών συντακτικά και γραμματικά---και η μεταγλώσσα, η οποία περιέχει τις προτάσεις που εκφέρουν την αλήθεια ή ψευδος των προτάσεων της γλώσσας. Η μεταγλώσσα είναι κι αυτή φυσικά μια γλώσσα, η οποία στη συγκεκριμένη περίπτωση χρησιμοποιεί τα ίδια σύμβολα με τη γλώσσα. Στο παραπάνω παράδειγμα η πρόταση 'ένα συν ένα κάνει δύο' ανήκει στη γλώσσα, ενώ η 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής' ανήκει στη μεταγλώσσα.
Μια μεταγλώσσα με τη σειρά της μπορεί να έχει μια τρίτη μεταγλώσσα η οποία περιγραφει την αλήθεια των προτάσεώ της. Για παράδειγμα <η πρόταση 'η πρόταση "ένα συν ένα κάνει δύο" είναι αληθής' είναι αληθής> ανήκει στη μεταγλώσσα της μεταγλώσσας.
Ο κλάδος της λογικής (ή των μαθηματικών) που ασχολείται με αυτά τα προβλήματα είναι η μεταλογική (ή τα μεταμαθηματικά).
Κατ' αναλογία, υπάρχει κάτι αντίστοιχο και στον προγραμματισμό. Όχι με έκφραση αλήθειας βέβαια. Στον αντικειμενοστραφή προγραμματισμό είναι γνωστές οι έννοιες της κληρονομικότητας (inheritance), πολυμορφίας (polymorphism), encapsulation (δε γνωρίζω την ελληνική έννοια), κ.α. Δημιουργούμε classes, υπερφορτώνουμε τελεστές, κρύβουμε δεδομένα, αλλά οι δυνατότητες της python επεκτείνονται και στον μεταπρογραμματισμό.
def struct(*args):
class mystruct: pass
for i in range(len(args)/2):
setattr(mystruct, args[2*i], args[2*i+1])
return mystruct