Emacs Lisp, γνωστή και ως elisp, είναι μια διάλεκτος Lisp, φτιαγμένη για την επέκταση και διαμόρφωση του επεξεργαστή κειμένου GNU Emacs.

Η emacs lisp μπορεί να μεταγλωττιστεί σε κώδικα byte[1], αλλά και σε γλώσσα μηχανής[2], μπορεί να χρησιμοποιηθεί ως γλώσσα προγραμματισμού σεναρίων παρόμοια με το Unix Κέλυφος Bourne (shell) ή Python όταν καλείτε το Emacs σε batch mode. Το emacs δεν παρουσιάζει καμία άλλη διεπαφή χρήστη όταν είναι σε batch mode, απλά εκτελεί το αρχείο και επιστρέφει το αποτέλεσμα (output).

Σύγκριση Με Άλλες Lisp

Επεξεργασία

Υπάρχουν πολλά κοινά στοιχεία με Maclisp, αλλά νεότερες εκδοχές του emacs υπάρχει συμβατότητα με Common Lisp σε αρκετά σημεία, συγκεκριμένα με την έκδοση του Emacs 24.3[3] και μετά.

Η γλώσσα για επέκταση των GNU προγραμμάτων που συνήθως προτιμάτε είναι η GNU guile[4], μια διάλεκτος Scheme του GNU project. Ωστόσο ο Ρίτσαρντ Στάλλμαν αποφάσισε να γράψεις μια δικιά του διάλεκτο lisp για να έχει περισσότερο έλεγχο στις επιδόσεις του Emacs, αφού οι υπολογιστές της εκείνης εποχής είχαν χαμηλές επιδόσεις. Έχουν γίνει προσπάθειες μέσα από το έργο του Guile Emacs[5] να γίνεται να επεκταθεί το Emacs χρησιμοποιώντας guile scheme αλλά και να υπάρχει συμβατότητα με emacs lisp.

Σε αντίθεση με άλλες lisp, δεν υπάρχει βελτιστοποίηση αναδρομικής κλήσης ουράς (tail call), που χωρίς αυτό εντολές που χρησιμοποιούν αναδρομή οδηγούν σε υπερχείλιση στοίβας (stack overflow).

Η elisp κατηγοριοποιείται σε Lisp-2, όπως η Common Lisp, πράγμα που σημαίνει ότι έχει έναν ξεχωριστό χώρο ονομάτων για τις συναρτήσεις, ο οποίος είναι διαφορετικός από τον χώρο ονομάτων που χρησιμοποιεί για άλλες μεταβλητές[6]

Παραδείγματα

Επεξεργασία

Η elisp έχει σχεδιαστεί για να παρέχει δομές δεδομένων και χαρακτηριστικά εργαλεία για επεξεργασία κειμένων, πολλά χαρακτηριστικά που βρίσκουμε σε γλώσσες προγραμματισμού γενικής χρήσης είναι δευτερεύων, όπως η ανάγνωση ενός αρχείο ανά μία γραμμή, ολόκληρο το αρχείο θα πρέπει να φορτωθεί σε emacs buffer και από εκεί να επεξεργασθεί.

Για να γράψουμε μια εντολή που στέλνει μήνυμα "Γεια σου" στον χρήστη θα μπορούσαμε να το κάνουμε ως εξής:

(defun hello ()
  (interactive)
  (message "Γεια σου"))

Το interactive δηλώνει ότι ο χρήστης μπορεί να καλέσει την εντολή hello διαδραστικά, χρησιμοποιώντας M-x ή να το ως ορισμένη εντολή με πλήκτρα. Για να ορίσουμε μια σειρά πλήκτρων που για να τρέξει η παραπάνω εντολή μπορούμε να το κάνουμε ως εξής:

(global-set-key (kbd "C-c h") #'hello)

Παραπομπές

Επεξεργασία