Συναρτησιακές ανασφάλειες

Σε συνέχεια μιας κουβέντας για τη Java που είχα με κάποια παιδιά από την Κοινότητα Ελεύθερου Λογισμικού ΕΜΠ, μου ήρθε ένα λινκ στο άρθρο The Perils of JavaSchools του Joel Spolsky. Στο άρθρο αυτό ο Spolsky ούτε λίγο ούτε πολύ γκρινιάζει για το επίπεδο των νέων αποφοίτων Computer Science επισημαίνοντας ότι η εκπαίδευση τους γυρνάει υπερβολικά γύρω απο τη Java σε ένα χαζό επίπεδο, παραβλέποντας τις τρομερές (κατά τη γνώμη του, αλλά who am I to argue?) εκπαιδευτικές δυνατότητες της εκπαίδευσης πάνω στις τέχνες του να καταλαβαίνει και να δουλεύει κανεις με pointers και συναρτησιακό προγραμματισμό.

Έχοντας σχεδόν εξ’ολοκλήρου μεταστραφεί στην Java, το άρθρο το ένιωσα σαν πρόκληση. Και ok, με pointers εχω δουλέψει αρκετά. Ένα από τα σημεία αναφοράς του Spolsky για τους pointers ήταν η κατασκευή ενός προγράμματος με λίστες και hashtables. Σε αυτήν την πρόκληση έχω απαντήσει εδώ και περίπου ένα χρόνο. Αλλά για το συναρτησιακό προγραμματισμό?

Δύο φορές συνάντησα συναρτησιακό προγραμματισμό στην ως τώρα πορεία μου. Η μία ήταν στο μάθημα “Γλώσσες Προγραμματισμού Ι”, στο 6ο εξάμηνο της ΣΗΜΜΥ ΕΜΠ και η άλλη ήταν στο μάθημα “Μεταγλωττιστές” στο 8ο. Η πρώτη ήταν μάλλον επιφανειακή. Μπορεί να ασχολήθηκα αρκετά, έχοντας αναλάβει για την ομάδα μου το κομμάτι της Lisp, άλλα το πρόγραμμα που έγραψα τελικά δεν δούλεψε ποτέ. Τη δεύτερη φορά, η ομάδα μου έφτιαξε έναν ολόκληρο compiler σε Ocaml.

Το πρόβλημα είναι ότι η Ocaml είναι φτιαγμένη με τέτοιο τρόπο που να μπορεί κανείς να γράψει σε όποιο στυλ προγραμματισμού βολεύεται: συναρτησιακό, προστακτικό, αντικειμενοστραφές. Ναι, είναι κατά βάση συναρτησιακή, στην παράδοση των ML γλωσσών, αλλά τουλάχιστον όσον αφορά το τι έκανα εγώ στον compiler, νομίζω ότι επιβεβαίωσα το ρητό που λέει ότι “you can write FORTRAN in any language”. Στα δικά μου μεγάλα κομμάτια του compiler, χρησιμοποιώ την Ocaml σαν μια “pattern matching C”…

Οπότε, χρειαζόταν να αποδείξω στον εαυτό μου ότι κάτι καταλαβαίνω και εγώ απο αναδρομές και συναρτησιακό προγραμματισμό. Και έκατσα και σε λίγη ώρα έφτιαξα το insertion sort σε (συναρτησιακή) Ocaml. Ιδού ο κώδικας:

let rec insert e lst = match lst with
| [] -> [e]
| h::t -> if e []
| h::t ->
begin match (insertion_sort t) with
| [] -> [h]
| th::tt -> if h < th then h::th::tt else th::(insert h tt) end;;[/sourcecode]Τώρα νιώθω (λίγο) καλύτερα.

Συναρτησιακές ανασφάλειες

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s