SlideShare a Scribd company logo
1 of 20
ΕΡΓΑΣΙΑ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ LISP
Εκπόνηση: Δαουλτζόγλου Αικατερίνη Α. Μ. :25/11
Τμήμα: Εφαρμοσμένης Πληροφορικής
Εξάμηνο: α’
Η παρακάτω εργασία στην γλώσσα προγραμματισμού LISP
πραγματοποιήθηκε στα πλαίσια του μαθήματος «Εισαγωγή στην
Πληροφορική» και θα περιλαμβάνει τα εξής στοιχεία :
• Ιστορική αναδρομή της γλώσσας
• Γενική δομή προγράμματος
• Θέματα σύνταξης(εισαγωγή σχολίων, ονοματολογία
μεταβλητών)
• Τύποι δεδομένων
• Τελεστές
• Δομές επανάληψης
• Δομές διακλάδωσης
• Πίνακες
• Υποπρογράμματα-Συναρτήσεις
1.Εισαγωγή-Ιστορική αναδρομή
LISP ονομάζεται μία ομάδα γλωσσών προγραμματισμού
υπολογιστών με μεγάλη ιστορία και χαρακτηριστική σύνταξη με
πλήρεις παρενθέσεις. Ο John McCarthy και οι μαθητές του ξεκίνησαν
να δουλεύουν στο πρώτο δείγμα της LISP το 1958,ενώ ο ΜcCarthy
ήταν ακόμα στο ΜΙΤ. Μετά τη FORTRAN η LISP είναι η παλιότερη
γλώσσα προγραμματισμού η οποία είναι ακόμη σε χρήση. Όπως και
η FΟRΤRΑΝ, η LISP έχει αλλάξει πολύ σε σχέση με την πρώτη της
εμφάνιση, με αρκετές διαλέκτους της να υπάρχουν ανά την ιστορία
της. Είναι αξιοσημείωτο πως βρίσκεται μέχρι σήμερα στην
επικαιρότητα των προγραμματιστικών γλωσσών. Σήμερα, οι
διάλεκτοι της LISP με την περισσότερη χρήση και διάδοση είναι η
Common LISP και η Scheme.
Η LISP, αν και αρχικά δημιουργήθηκε ως μία πρακτική
μαθηματική σημειολογία για προγράμματα υπολογιστών ,θεωρείται
γλώσσα που προέρχεται ,κυρίως, από την Τεχνική Νοημοσύνη (ΤΝ
είναι η μελέτη του πώς να κάνεις τους υπολογιστές να κάνουν
πράγματα ,τα οποία οι άνθρωποι, αυτή τη στιγμή, κάνουν καλύτερα.
Αυτός ο ορισμός , φυσικά , είναι εφήμερος, εξαιτίας της αναφοράς
του στην τρέχουσα κατάσταση της τεχνολογίας της επιστήμης των
υπολογιστών.) Ανήκει στην κατηγορία των λεγόμενων
συναρτησιακών γλωσσών (functioning languages) στηρίζεται δηλαδή
στην μαθηματική θεωρία των αναδρομικών κλήσεων.
Βασική δομή δεδομένων στη LISP είναι η λίστα από όπου
προέρχεται και το όνομα της ( LISt Processing). Δηλαδή οι
επεξεργασίες σ’ ένα πρόγραμμα LISP είναι κατά βάση επεξεργασίες
λιστών. Δεδομένου δε ότι μια λίστα μπορεί να περιέχει σύμβολα ή
συμβολικές δομές, η LISP είναι κατάλληλη για επεξεργασία
συμβόλων και συμβολικών δομών, δηλ. γι’ αυτό που ονομάζουμε
συμβολικό υπολογισμό (symbolic computation). Ενώ ο αριθμητικός
υπολογισμός (arithmetic computation) βασίζεται σε αριθμητικές
πράξεις, ο συμβολικός υπολογισμός αναφέρεται στη δημιουργία και
διαχείριση συμβολικών δομών. Αυτός είναι ο λόγος που η LISP έγινε
(και είναι) η δημοφιλέστερη γλώσσα στην επιστημονική κοινότητα
της Τεχνητής Νοημοσύνης.
Τέλος, η LISP είναι μία διερμηνευτική γλώσσα (interpreted).
Αυτό σημαίνει ότι αντί να μεταγλωττίζει πρώτα ό, τι γράφει ο
χρήστης σε γλώσσα μηχανής και κατόπιν να εκτελεί το πρόγραμμα,
εξετάζει το τι έχει γραφεί γραμμή προς γραμμή, καταλαβαίνει τι έχει
ζητηθεί και μετά το εκτελεί. Το πλεονέκτημα αυτού έγκειται στο ότι ο
προγραμματιστής μπορεί εύκολα και συχνά να κάνει αλλαγές και να
τι δοκιμάζει , χωρίς να χρειάζεται να περιμένει το μεταγλωττιστή να
μεταγλωττίσει ολόκληρο το πρόγραμμα κάθε φορά. Βέβαια το βασικό
μειονέκτημα ότι είναι μία «αργή» γλώσσα. Ο πρώτος πλήρης
μεταγλωττιστής για LISP, γραμμένος σε LISP, υλοποιήθηκε
το 1962 από τον Tim Hart και τον Mike Levin στο ΜΙΤ.
Η LISP γενικά θεωρείται μια εύκολη, ευέλικτη γλώσσα που μπορεί
κάποιος εύκολα να μάθει διότι έχει σχετικά απλή σύνταξη και μία
περιορισμένη βάση συντακτικού. Το γεγονός ακόμη, ότι η LISP
χρησιμοποιούνταν σε ερευνητικά περιβάλλοντα, όπου η
μεταφερσιμότητα δεν ήταν σημαντικός παράγοντας, οδήγησε στην
ανάπτυξη πολυάριθμων διαλέκτων της LISP όπως η MACLISP, INTER
LISP,muLISP κλπ. Παρ’ όλα αυτά τελευταία υπάρχει μια τάση για
ενοποίηση των «διαλέκτων» αυτών.
Η LISP υλοποιήθηκε για πρώτη φορά από τον Steve Russell σε
ένα IBM 704 υπολογιστή.
Λίγα λόγια για την επινόηση της LISP
Ο John McCarthy ο άνθρωπος που εισήγαγε τη LISP, επινόησε επίσης
και τον όρο «Τεχνητή Νοημοσύνη». Εξέφρασε το ενδιαφέρον του για
τη συγκεκριμένη γλώσσα κατά τη διάρκεια του συνεδρίου του
Dartmouth (1956,Hanover ) και ξεκίνησε μαζί με την ομάδα του να
σχεδιάζει και να εφαρμόζει μία καλύτερη LISt Processing language.
Το συνέδριο εκτίμησε την ανάγκη για μια νέα γλώσσα επεξεργασίας
λιστών, στοχεύοντας στην αναδυόμενη περιοχή( emerging field) της
Τεχνικής Νοημοσύνης.O McCarthy συνέχισε τις προσπάθειες του για
την υποδειγματοποίηση της αυτής της νέας γλώσσας, βασίζοντας
την στη FORTRAN . Χρησιμοποίησε έναν υπολογιστή ΙΒΜ 704 όπου
κάθε εντολή αποτελείται από 4 μέρη: 2 μέρη διευθύνσεων, το
πρόθεμα και την ετικέτα. Αυτά τα μέρη χρησιμοποιήθηκαν για την
ανάκληση των περιεχομένων των διευθύνσεων της μνήμης που
έδειχναν σε αυτές(διευθύνσεις) που αποτέλεσαν το αρχικό σχέδιο
της LISP. Στη συνέχεια ο McCarthy ,κατά τη διάρκεια της
υποδειγματοποίησης συνέταξε μια εργασία όπου αποδείκνυε πως θα
μπορούσε να γραφεί μια γενική συνάρτηση της LISP η οποία θα
μπορούσε να διερμηνεύει κάθε συνάρτηση (και την ίδια τη LISP, ως
συνέπεια των χαρακτηριστικών της μηχανής Turing) δημιουργώντας
έτσι τη συνάρτηση EVAL η οποία έγινε ο διερμηνευτής της γλώσσας.
Η LISP γεννήθηκε!
2.Γενική δομή προγράμματος
Οι λίστες είναι ο θεμελιώδης τύπος δεδομένων στη LISP. Οι λίστες
είναι ο τύπος δεδομένων στη LISP. Γενικά οι δομές δεδομένων της
LISP καλούνται Συμβολικές Εκφράσεις (s-expressions) . Αυτές οι
συμβολικές εκφράσεις είναι τα άτομα ή οι ακολουθίες.
Η LISP δεν απαιτεί δηλώσεις τύπων για τις μεταβλητές. Αυτό
ελευθερώνει τον προγραμματιστή από τέτοιες λεπτομέρειες, αλλά
δεν βοηθά στον έλεγχο του προγράμματος.
Το μόνο που διαθέτει είναι τα ειδικά σύμβολα Τ (true) και NIL.
Το NIL είναι ταυτόσημο με την κενή λίστα ‘()’ και αντιπροσωπεύει το
ψεύδος μιας πρότασης, ενώ το Τ την αλήθεια.
Μια λίστα είναι της μορφής (e1 e2 … en), όπου ei άτομο ή
λίστα. Μπορεί να έχει απεριόριστο μήκος, δηλ. να έχει (θεωρητικά)
άπειρα στοιχεία, και (θεωρητικά) απεριόριστο βάθος, δηλ. κάποια
στοιχεία της να είναι λίστες, που περιέχουν άλλες λίστες κ .ο .κ.
Μια συμβολοσειρά είναι μια ακολουθία χαρακτήρων, που
συνήθως βρίσκεται σε διπλά εισαγωγικά.
Σ-έκφραση
Ακολουθία
άτομο
Αριθμός
Σύμβολο
Π.χ. x,
b24,bet
Λίστα π.χ. (1 2 a 3) , (a
(12(3)) b (c d))
Συμβολοσειρά
Π.χ. “Hello”, ”a”,
“This is a string” Ακέραιος π.χ.
2, -58
Ρητός π.χ.
27/6
Πραγματικός
Π.χ. 32.5,-1.9
Η λίστα για παράδειγμα : (AYTH EINAI MIA SYMBOLIKH
EKFRASH)
Είναι μια λίστα που αποτελείται από 5 άτομα περικλειόμενα σε
παρενθέσεις ενώ η
((ITALIA INTER) (AGGLIA LIVERPOOL))
Είναι μια λίστα αποτελούμενη από 2 υπολίστες.
3.Τύποι δεδομένων
Όπως είναι φανερό και όπως προαναφέρθηκε η λίστα είναι η
σημαντικότερη και βασικότερη δομή δεδομένων στη γλώσσα LISP
καθώς αποτελεί το κύριο χαρακτηριστικό της και όλες τις οι
λειτουργίες και δομές βασίζονται πάνω σε αυτές.
-Ο Βρόχος READ-EVAL-PRINT (Ανάγνωση-εκτίμηση- εκτύπωση)
Η Lisp διαβάζει τη σ-έκφραση και στη συνέχεια τυπώνει μια
άλλη σ-έκφραση. Αυτή η διαδικασία ονομάζεται βρόχος READ-EVAL-
PRINT.
Η συνάρτηση EVAL είναι το κεντρικό τμήμα της γλώσσας LISP
.Σκοπός της είναι να εκτιμήσει τις σ-εκφράσεις, οι οποίες θεωρούνται
ορίσματα της. Τα ψηφία και τα Τ και NIL θα εκτιμηθούν στους
εαυτούς τους. Τα ψηφία είναι αριθμητικά άτομα και εκτιμούνται στις
αντίστοιχες τιμές τους.
Παραδείγματα:
$4 ;Το 4 είναι ένα αριθμητικό άτομο που
4 ;εκτιμάται στην εαυτό του.
$t ;Είναι ένα αριθμητικό συμβολικό άτομο που
T ; εκτιμάται στον εαυτό του.
$(+ 4 5) ;Τα ορίσματα 4 και 5 εκτιμούνται πριν η
9 ; συνάρτηση + κληθεί
Τα εισαγωγικά όμως (απόστροφος) κάνουν τα σύμβολα να
εκτιμούνται στους εαυτούς τους κι όχι στις λίστες. Δηλαδή :
$’ ( + 4 5)
(+ 4 5)
Καλό είναι πριν από κάθε read να υπάρχει εκτύπωση κάποιου
μηνύματος που να πληροφορεί τον χρήστη ότι πρέπει κάτι να
πληκτρολογήσει. Αυτό γίνεται με τη χρήση της συνάρτησης εξόδου
print. Αν εκτελέσουμε την παρακάτω έκφραση
$ (print ‘(Give a number))
το αποτέλεσμα θα είναι
(GIVE A NUMBER) ;αυτό είναι το αποτέλεσμα της ενέργειας της print
‘Ένα παράδειγμα με συνάρτηση και κλήση είναι το εξής:
(defun print-what-type ()
(print ‘(please type a number :))
(setf num (read))
(print (append ‘(you typed) (list num))))
$(print-what-type)
$(PLEASE TYPE A NUMBER) 45
Για μία πιο «προσεγμένη» εκτύπωση μπορεί να χρησιμοποιηθεί η
συνάρτηση format t η οποία παρατίθεται παρακάτω.
-Θεμελιώδη στοιχεία λιστών
Πρέπει να υπάρχει μια δεξιά παρένθεση για κάθε αριστερή ώστε να
επιτυγχάνεται η λεγόμενη ισορροπημένη λίστα. Παράδειγμα:
(XRHSTOS ALIKH SPYROS ANNA) αυτή είναι μια απλή λίστα, ενώ η:
(MPOREIS NA EXEIS LISTES (MESA SE) LISTES).
Είναι μια θυλακωτή λίστα.
-() κενή λίστα ή για τη LISP ο τύπος NIL .Αυτό που προκαλεί
σύγχυση πολλές φορές είναι το γεγονός ότι το NIL μπορεί να είναι
σύμβολο και κενή λίστα ταυτόχρονα.
Μία κωδικοποιημένη λίστα:
Το NIL σημαίνει ότι η λίστα τελειώνει και δεν μπορεί να
αντιμετωπιστεί σαν στοιχείο στη λίστα.
Από τη σκοπιά της συμβολικής επεξεργασίας οι λίστες είναι
θεμελιώδεις. Από τη στιγμή που μπορούν να είναι οποιουδήποτε
μεγέθους, μπορούν εύκολα να απεικονίζουν πληροφορίες
οποιασδήποτε πολυπλοκότητας:
(NIKOS
(YPSOS 1.75)
(BAROS 75)
(EPAGGELMA (LEKTORAS PANEPHSTHMIOY)))
Εντολή (συνάρτηση) εκχώρησης
Η διαδικασία της παραχώρησης μια τιμής σε ένα σύμβολο ονομάζεται
εκχώρηση. Αυτή η διαδικασία αντικαθίσταται από τη συνάρτηση
SETQ. H SETQ έχει σαν αποτέλεσμα, το δεύτερο όρισμα να γίνεται η
τιμή του πρώτου ορίσματος, το οποίο πρέπει να είναι συμβολικό
άτομο. Παραδείγματα χρήσης:
$(SETQ XRHSTOS ‘XRHSTOS)
XRHSTOS
$L ;Η τιμή που επιστρέφεται από
(A B) ; την SETQ είναι η τιμή που
;δίνεται στο πρώτο όρισμα.
$L ;Από εδώ και στο εξής το L θα αναφέρεται στη
(A B) ;λίστα (Α Β) μέχρι να αλλαχτεί η τιμή του.
$SETQ PAPADOPOYLOS ‘(ANNA DHMHTRHS NTENHS))
(ANNA DHMHTRHS NTENHS) ;Η τιμή που επιστρέφεται από
;τη SETQ είναι η τιμή που
;δίνεται στο πρώτο όρισμα.
$PAPADOPOULOS
(ANNA DHMHTRHS NTENHS)
Η συνάρτηση SET είναι όμοια με τη SETQ ,με τη διαφορά ότι σε αυτή
και τα δύο ορίσματα εκτιμούνται:
$(SET FONHENTA ‘(A E I O Y )) ;Το συμβολικό όνομα FONHENTA
(A E I O Y) ;είναι σε μορφή αποστρόφων.
$(SET LISTA FONHENTA)
(A E I O Y)
$LISTA
(A E I O Y)
Η LISP επιπλέον, επιτρέπει τη δημιουργία νέων τύπων δεδομένων με
τη μορφή των λεγόμενων δομών (structures). Μια δομή αποτελείται
από πεδία (fields) και τιμές (values) των πεδίων. Η δημιουργία μιας
δομής γίνεται με τη βοήθεια του defstruct ως εξής:
(defstruct <structure name>
(<field1> <value1)
(<field2> <value2)
(<fieldn> <valuen))
Η defstruct δημιουργεί μια δομή, ένα καλούπι, αλλά όχι στιγμιότυπα
της δομής. Δημιουργεί όμως μαζί με τη δομή και μια συνάρτηση-
δημιουργό στιγμιότυπων. Αυτή η συνάρτηση έχει όνομα make-
<structure name>, δηλ. για την παραπάνω δομή είναι η make-
student. Μ’ αυτή μπορούμε να δημιουργήσουμε στιγμιότυπα της
δομής student. Π.χ. η
$ (setf maria (make-student))
#S(STUDENT :YEAR NIL :SEX NIL :PERFORMANCE NIL)
δημιουργεί ένα στιγμιότυπο με όνομα MARIA με τιμές πεδίων τις
αρχικές (εξ’ ορισμού) τιμές.
Επίσης, η defstruct δημιουργεί και συναρτήσεις ανάγνωσης, για την
προσπέλαση των τιμών των πεδίων. Αυτές έχουν σαν όνομα το
<structure name>-<field name>, δηλ. στην περίπτωσή μας θα είναι
οι student-year, student-sex και student-performance. Τώρα
# (student-sex maria)
NIL
4. Τελεστές
Βασικών πράξεων
+,-,/,*,float
Π.χ.
$ (/ 27 9)
3
$ (/ 4.16 1.3)
3.2
$ (/ 22 7)
22/7
$ (float (/ 22 7))
3.14...
(Αριθμητικές Συναρτήσεις )
Υπολογισμών
• round, max, min, expt, sqrt, abs
Π.χ.
$ (max 2 4 3)
4
$ (min 2 4 3)
2
$ (expt 2 3)
8 ;δηλ. 23
$ (sqrt 6.25)
2.5
$ (abs –5.5)
5.5
$ (round (/ 22 7))
3 ;πλησιέστερος ακέραιος, πρώτη γραμμή
1/7 ; υπόλοιπο, δεύτερη γραμμή
$ (setf x (round (/ 22 7)))
3
$ x
3
Αναγνώρισης
zerop: επιστρέφει Τ αν το όρισμά του έχει τιμή ‘0’
plusp: επιστρέφει Τ αν το όρισμά του είναι θετικός αριθμός
minusp: επιστρέφει Τ αν το όρισμά του είναι αρνητικός αριθμός
evenp: επιστρέφει Τ αν το όρισμά του είναι άρτιος (ακέραιος) αριθμός
oddp: επιστρέφει Τ αν το όρισμά του είναι περιττός (ακέραιος) αριθμός
> : επιστρέφει Τ αν τα ορίσματά του (τουλάχιστον 2) είναι κατά
φθίνουσα σειρά
< : επιστρέφει Τ αν τα ορίσματά του (τουλάχιστον 2) είναι κατ’
αύξουσα σειρά
5.Θέματα σύνταξης
Το συντακτικό της LISP περιλαμβάνει τα εξής στοιχεία:
• ( :Η αριστερή παρένθεση σηματοδοτεί την αρχή μιας λίστας
• ) :Η δεξιά παρένθεση σηματοδοτεί το τέλος μιας λίστας
,για παράδειγμα ( Α Β Γ )
• ‘ :Το εισαγωγικό (απόστροφος) αποτρέπει την εκτίμηση
της σ-έκφρασης (s-expression) που ακολουθεί.
• ; :Το ερωτηματικό επιτρέπει τα σχόλια στη LISP .Όλοι οι
χαρακτήρες μετά από αυτό αγνοούνται.
• “ :Οι συμβολοσειρές περικλείονται σε διπλές αποστρόφους.
Π. χ. (PRINC “ALIKH ANNA”) εκτυπώνει ALIKH ANNA| ALIKH
ANNA|
•  : Ο χαρακτήρας backlash (ανάστροφη κάθετος) επιτρέπει
να αντιμετωπιστεί ο επόμενος χαρακτήρας σα γράμμα και όχι
σαν συντακτική τιμή. Για παράδειγμα οι διπλές απόστροφοι
μπορούν να αντιμετωπιστούν σαν συμβολοσειρά με το να
τοποθετηθεί ο χαρακτήρας backlash. Για παράδειγμα στην
έκφραση ««ΓΕΙΑ»» διαβάζει «ΓΕΙΑ».
• ~% :αλλαγή γραμμής
Όσον αφορά την ονοματολογία μεταβλητών στη LISP μπορούν να
χρησιμοποιηθούν όλα τα γράμματα του λατινικού αλφαβήτου
κεφαλαία και μικρά ενώ θα πρέπει φυσικά να δίνεται ιδιαίτερη
προσοχή στις δεσμευμένες λέξεις (οι οποίες αναφέρονται στην
πορεία της παρουσίασης). Επίσης, οι μεταβλητές που έχουν
αναφερθεί και θα αναφερθούν παρακάτω έχουν τοπική εμβέλεια
όμως, συχνά είναι απαραίτητη η ύπαρξη μεταβλητών καθολικής
εμβέλειας, δηλαδή μεταβλητών που να είναι ορατές από όλες τις
συναρτήσεις ενός προγράμματος. Αυτό επιτυγχάνεται με τη devfar:
(defvar <όνομα-μεταβλητής>)
6.Συναρτήσεις
-Συναρτήσεις της γλώσσας
ΣΥΝΑΡΤΗΣΕΙΣ ΠΡΟΣΠΕΛΑΣΗΣ-ΣΥΝΘΕΣΗΣ-ΤΡΟΠΟΠΟΙΗΣΗΣ-
ΑΝΑΓΝΩΡΙΣΗΣ ΤΥΠΩΝ-ΣΥΓΚΡΙΣΗΣ-ΣΥΜΜΕΤΟΧΗΣ-ΕΚΤΥΠΩΣΗΣ
ΟΝΟΜΑ ΣΥΝΤΑΞΗ ΛΕΙΤΟΥΡΓΙΑ
(ΤΙ ΕΠΙΣΤΡΕΦΕΙ)
ΠΑΡΑΔΕΙΓΜΑ
Car (car<list>) το πρώτο στοιχείο
της λίστας
$(car ‘(1 2 3))
1
Cdr (cdr<list>) τη λίστα χωρίς το
πρώτο στοιχείο της
$(cdr ‘(1 2 3))
2 3
Cxxxxr (x ≡ a, d) Με τη σύνταξη αυτή
δίνεται η δυνατότητα
πραγματοποίησης
πολλών
συνδυασμών-
συναρτήσεων,
εναλλάσσοντας ‘a’
και ‘d’
(caadr lista) ≡ (car
(car (cdr lista)))
(cdadr lista) ≡ (cdr (car
(cdr lista)))
last (last <list>) Τη λίστα με μόνο το
τελευταίο στοιχείο
$ (last ‘(1 2 3))
(3)
butlast (butlast <list>
<n>)
Τη λίστα χωρίς τα
τελευταία n
στοιχεία
$(butlast ‘(1 2 3 4) 2)
(1 2 )
Nthcdr (nthcdr <n> <list>) Τη λίστα χωρίς τα
πρώτα n στοιχεία
$ (nthcdr 2 ‘(1 2 3 4))
(3 4)
Length (length <list>) Το μήκος της λίστας
(ακέραιος).
$ (length ‘(a 2 b))
3
Reverse (reverse <list>) Την ανάστροφη
λίστα
$ (reverse ‘(1 2 3))
(3 2 1)
Cons (cons <atom>
<atom>) ή (cons
<list> <atom>)
Το αντίστοιχο
ζεύγος
$ (cons ‘x ‘a)
(X . A)
List (list <s-
expression>*)
(Το * σημαίνει μία ή
περισσότερες
επαναλήψεις)
Μια λίστα που
περιέχει τις <s-
expression>
$ (list ‘a ‘(2 3) ‘b)
(A (2 3) B)
Append (append <list>*)
(Το * σημαίνει μία ή
περισσότερες
επαναλήψεις)
Μια λίστα που
συγχωνεύει όλες τις
<list>.
$ (append ‘(a b) ‘(c) ‘(d))
(A B C D)
Push (push <s-
expression>
<symbol>), όπου το
<symbol> έχει σαν
τιμή μια λίστα
Τη λίστα με επί
πλέον πρώτο
στοιχείο την <s-
expression>
$x
(A B C)
$ (push 1 x)
(1 A B C)* x → (1 A B C)
pop (pop <symbol>),
όπου το <symbol>
έχει σαν τιμή μια
λίστα
Τη λίστα με χωρίς
πρώτο στοιχείο της
Η τιμή του
<symbol> γίνεται η
νέα λίστα.
$x
(1 A B C)
$ (pop x)
(A B C)
x (A B C)
eq (<eq-fun>
<argum1>
<argum2> (γενική
Τ όταν πρόκειται
για δύο ίδια
σύμβολα.
$(eq ‘exit ‘exit)
T
-Oι παραπάνω ήταν οι συναρτήσεις της ίδιας της γλώσσας
προγραμματισμού οι οποίες είναι σαφώς απαραίτητες για την
επεξεργασία των λιστών, την τροποποίηση τους, για σύγκριση
μεταξύ των στοιχείων τους κλπ.
Κάτωθι παρουσιάζεται πώς μπορεί ο χρήστης να ορίσει μια
συνάρτηση σε ένα πρόγραμμα κι αυτό γίνεται με τη βοήθεια της
defun:
(defun <function-name> (<param1> … <paramn>)
<form1>
…
<formm>)
όπου <function-name> είναι το όνομα της συνάρτησης που θέλουμε
να ορίσουμε, τα <parami> είναι τα ορίσματα ή τυπικές παράμετροι
της συνάρτησης και τα <formi> είναι συναρτησιακοί τύποι.
Π.χ. ο παρακάτω κώδικας LISP ορίζει μια συνάρτηση mesos-oros,
που έχει δύο ορίσματα (num1 και num2) και υπολογίζει το μέσο όρο
των ορισμάτων της.
$(defun mesos-oros (num1 num2)
(/ (+ num1 num2) 2))
Κλήση
Μια κλήση της παραπάνω συνάρτησης είναι:
$(mesos-oros 5 3)
4
Η συνάρτηση let χρησιμοποιείται για ανάθεση (αρχικών) τιμών σε
μεταβλητές. Η σύνταξή της έχει ως εξής:
(let ((<param1> <init-value1>)
(<param2> <init-value2>)
. . .
(<paramn> <init-valuen>))
<form1>
…
<formn>)
Στην παραπάνω δομή, εκτιμώνται τα <init-value1>, <init-
value2>, ... <init-valuen> και τα αποτελέσματά τους καταχωρούνται
στα <param1>, <param2>, ... <paramn> αντίστοιχα.
7.Δομές διακλάδωσης
Διάταξη if
Η διάταξη if έχει την παρακάτω σύνταξη:
(if <condition> <then form> [<else form>])
όπου ότι υπάρχει μεταξύ ‘[’ και ‘]’ είναι προαιρετικό.
Η λειτουργία της έχει ως εξής: Εκτιμάται η συνθήκη <condition>. Αν
το αποτέλεσμα είναι διάφορο του NIL, εκτιμάται η έκφραση <then
form> και επιστρέφεται η τιμή της, αλλιώς εκτιμάται η <else form>,
αν υπάρχει, και επιστρέφεται η τιμή της, αλλιώς (δηλ. αν δεν
υπάρχει) επιστρέφεται NIL.
Διάταξη cond
Η διάταξη cond έχει την παρακάτω σύνταξη:
(cond (<condition1> [<action1-1>, <action1-2>, ... <action1-n>])
(<condition2> [<action2-1>, <action2-2>, ... <action2-n>])
. . .
(<conditionm> [<actionm-1>, <actionm-2>, ... <actionm-n>]))
όπου τα <actioni-j> είναι προαιρετικά.
Η λειτουργία της έχει ως εξής: Εκτιμώνται οι συνθήκες
<condition1>, …, <conditionm> με τη σειρά. Με το πρώτο
<conditioni> που θα δώσει αποτέλεσμα διάφορο του NIL, εκτιμώνται
οι αντίστοιχες εκφράσεις ενέργειας <actioni-j> και επιστρέφεται η
τιμή της τελευταίας. Αν δεν υπάρχουν εκφράσεις ενέργειας, αυτό
που επιστρέφεται είναι το αποτέλεσμα του <conditioni>. Αν καμία
συνθήκη δεν δώσει αποτέλεσμα διάφορο του NIL, τότε επιστρέφει
NIL.
Διάταξη case
Η διάταξη case έχει την παρακάτω σύνταξη:
(case <key term>
(<key1> <action1-1>[, <action1-2>, ... <action1-n>])
(<key2> <action2-1>[, <action2-2>, ... <action2-n>])
. . .
(<keym> <actionm-1>[, <actionm-2>, ... <actionm-n>]))
Η λειτουργία της έχει ως εξής: Εκτιμάται ο <key form> και
συγκρίνεται με καθένα από τα <key1>, …, <keym> (χωρίς
εκτίμηση) με τη σειρά με βάση το κατηγόρημα (συνάρτηση)
σύγκρισης eql. Με το πρώτο <keyi> για το οποίο η σύγκριση θα
δώσει αποτέλεσμα Τ, εκτιμώνται οι αντίστοιχες εκφράσεις ενέργειας
<actioni-j> και επιστρέφεται η τιμή της τελευταίας. Αν καμία
σύγκριση δεν δώσει αποτέλεσμα Τ, τότε επιστρέφει NIL, εκτός εάν η
τελευταία πρόταση της case έχει σαν <keym> το “otherwise” ή το
“t”, οπότε εκτελούνται οι ενέργειές της.
8.Δομές επανάληψης
Διάταξη dotimes
Η διάταξη dotimes έχει την παρακάτω σύνταξη:
(dolist (<parameter> <up-bound form> [<result form>])
<form1>
… <formn>)
Η λειτουργία της έχει ως εξής: Εκτιμάται το <up-bound form>, που
πρέπει να έχει σαν αποτέλεσμα ένα αριθμό, έστω n. Στη συνέχεια,
αποδίδονται οι ακέραιες τιμές 0 … n-1 στην <parameter> διαδοχικά.
Για κάθε τιμή εκτελούνται τα <form1> … <formn>. Τέλος, εκτιμάται
το <result form> και επιστρέφεται η τιμή του. Αν δεν υπάρχει
<result form>, επιστρέφεται NIL.
Διάταξη dolist
Η διάταξη dolist έχει την παρακάτω σύνταξη:
(dolist (<parameter> <list form> [<result form>])
<form1>
…
<formn>)
Η λειτουργία της έχει ως εξής: Εκτιμάται το <list form>, που πρέπει
να έχει σαν αποτέλεσμα λίστα. Στη συνέχεια αποδίδονται τα στοιχεία
της λίστας ένα-ένα σαν τιμές στο <parameter>. Σε κάθε απόδοση
τιμής εκτελούνται τα <form1> … <formn>. Τέλος εκτιμάται το
<result form> και το αποτέλεσμά του επιστρέφεται σαν αποτέλεσμα
της διάταξης. Αν δεν υπάρχει <result form>, επιστρέφεται NIL.
Διάταξη do
Η διάταξη do είναι συνθετότερη της dolist, αλλά και με περισσότερες
δυνατότητες. Η σύνταξή της είναι η εξής:
(do ((<param1> [<init-val1> [<update-form1>]])
. . . (<paramn> [<init-valn> [<update-formn>]]))
(<termin-test> [[<intermed-form>*] <result-form>])
<form1>
…
<formn>)
όπου ένα ή περισσότερα <intermed-form> δεν μπορούν να
υπάρχουν αν δεν υπάρχει <result-form>. Η λειτουργία της έχει ως
εξής: Εκτιμώνται τα <init-vali> και καταχωρούνται στις αντίστοιχες
παραμέτρους (παράλληλα). Εξετάζεται το <termin-test>. Αν είναι
NIL (δηλ. δεν αληθεύει), εκτελείται το σώμα (<form1> … <formn>).
Στη συνέχεια εκτιμώνται τα <update-formi> και τα αποτελέσματά
τους αποδίδονται στις αντίστοιχες παραμέτρους (παράλληλα).
Κατόπιν, εξετάζεται το <termin-test> κ. ο .κ. Αν το <termin-test>
βρεθεί να αληθεύει (είναι δηλ. Τ), τότε εκτιμώνται τα <intermed-
form>, αν υπάρχουν, και το <result-form>, αν υπάρχει.
Επιστρέφεται δε το αποτέλεσμα του <result-form>. Αν δεν υπάρχει
<result-form>, επιστρέφεται NIL.
Διάταξη loop
Μια άλλη διάταξη επανάληψης, που δεν χρησιμοποιείται όμως συχνά,
είναι η loop, που έχει την εξής σύνταξη:
(loop <form1>, <form2>, ..., <formn>)
Στη διάταξη αυτή τα <form1>, <form2>, ..., <formn> εκτελούνται
συνεχώς με τη σειρά αναγραφής, μέχρις ότου εκτελεστεί κάποια
πρόταση return, οπότε και επιστρέφεται το αποτέλεσμά της.
9.Πίνακες
Η δημιουργία ενός μονοδιάστατου πίνακα στη LISP γίνεται ως εξής:
(setf <array name> (make-array <dimension>))
Π.χ. η
$ (setf students (make-array 4))
#(0 0 0 0)
;(αυτός είναι ο τρόπος που η LISP
παρουσιάζει ένα πίνακα στην οθόνη)
δημιουργεί ένα μονοδιάστατο πίνακα με όνομα students που έχει 4
στοιχεία. Τα στοιχεία ενός πίνακα στη LISP αριθμούνται από το 0
(εδώ από 0-3). Αν δεν αρχικοποιήσουμε ένα πίνακα, τότε δίνονται
μηδενικά στοιχεία.
Επίσης, πρέπει να σημειώσουμε ότι τα στοιχεία ενός πίνακα στη LISP
μπορεί να είναι οτιδήποτε, δηλ. και ετερογενή. Δεν απαιτείται όπως
σε άλλες γλώσσες να είναι κοινού τύπου.
Η αρχικοποίηση ενός πίνακα μπορεί να γίνει με διάφορους τρόπους.
(α) Με τη χρήση της παραμέτρου :initial-element κατά τη δημιουργία
του πίνακα.
Π.χ.
$ (set students (make-array 4: initial-element NIL))
# (NIL NIL NIL NIL) ή
$ (set students (make-array 4: initial-element ‘a))
#(A A A A)
(β) Με τη χρήση της παραμέτρου :initial-contents κατά τη
δημιουργία του πίνακα.
Π.χ.
$ (set students (make-array 4: initial-contents ‘(a b c d)))
# (A B C D)
(γ) Με την ανάθεση τιμών σε κάθε στοιχείο του μέσω της aref.
Π.χ.
$ (set (aref students 0) ‘a)
A
$ (set (aref students 1) ‘b)
B κλπ.
Η προσπέλαση των στοιχείων ενός πίνακα γίνεται ως εξής:
(aref <array name> <element index>)
Π.χ.
$ (aref students 1)
B ;(αναφερόμενοι στην τελευταία αρχικοποίηση)
Ο ορισμός δισδιάστατου πίνακα γίνεται κατά αντίστοιχο τρόπο:
(set <array name> (make-array <dimensions>))
Π.χ. η
$ (setf marks (make-array ‘(2 3)))
#2A((0 0 0) (0 0 0))
δημιουργεί ένα δισδιάστατο πίνακα με όνομα marks που έχει 2x3=6
στοιχεία.
Η αρχικοποίηση ενός δισδιάστατου πίνακα μπορεί να γίνει με τους
ίδιους ακριβώς τρόπους όπως και ένας μονοδιάστατος.
Βιβλιογραφία:
1. G. L. Steele JR, “Common Lisp, The Language”, Digital
Ρress, 1984
2. ANSI-Common LISP – Paul Graham ,Prentice hall New
Jersey 1996
3. LISP in small pieces – Christian Queinnec Cambridge
University Press 1996
4. Έμπειρα συστήματα – Τεχνητή Νοημοσύνη και LISP -
Γεώργιος Δουκίδης, Μάριος Αγγελίδης Εκδόσεις Ι. Σιδέρης 2003
5. Εγκυκλοπαίδεια ΥΔΡΙΑ
6. http://en.wikipedia.org/wiki/Lisp_(programming_language)
ΕΡΓΑΣΙΑ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ LISP

More Related Content

Featured

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

Featured (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

ΕΡΓΑΣΙΑ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ LISP

  • 1. ΕΡΓΑΣΙΑ ΣΤΗ ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ LISP Εκπόνηση: Δαουλτζόγλου Αικατερίνη Α. Μ. :25/11 Τμήμα: Εφαρμοσμένης Πληροφορικής Εξάμηνο: α’
  • 2. Η παρακάτω εργασία στην γλώσσα προγραμματισμού LISP πραγματοποιήθηκε στα πλαίσια του μαθήματος «Εισαγωγή στην Πληροφορική» και θα περιλαμβάνει τα εξής στοιχεία : • Ιστορική αναδρομή της γλώσσας • Γενική δομή προγράμματος • Θέματα σύνταξης(εισαγωγή σχολίων, ονοματολογία μεταβλητών) • Τύποι δεδομένων • Τελεστές • Δομές επανάληψης • Δομές διακλάδωσης • Πίνακες • Υποπρογράμματα-Συναρτήσεις 1.Εισαγωγή-Ιστορική αναδρομή LISP ονομάζεται μία ομάδα γλωσσών προγραμματισμού υπολογιστών με μεγάλη ιστορία και χαρακτηριστική σύνταξη με πλήρεις παρενθέσεις. Ο John McCarthy και οι μαθητές του ξεκίνησαν να δουλεύουν στο πρώτο δείγμα της LISP το 1958,ενώ ο ΜcCarthy ήταν ακόμα στο ΜΙΤ. Μετά τη FORTRAN η LISP είναι η παλιότερη γλώσσα προγραμματισμού η οποία είναι ακόμη σε χρήση. Όπως και η FΟRΤRΑΝ, η LISP έχει αλλάξει πολύ σε σχέση με την πρώτη της εμφάνιση, με αρκετές διαλέκτους της να υπάρχουν ανά την ιστορία της. Είναι αξιοσημείωτο πως βρίσκεται μέχρι σήμερα στην επικαιρότητα των προγραμματιστικών γλωσσών. Σήμερα, οι διάλεκτοι της LISP με την περισσότερη χρήση και διάδοση είναι η Common LISP και η Scheme. Η LISP, αν και αρχικά δημιουργήθηκε ως μία πρακτική μαθηματική σημειολογία για προγράμματα υπολογιστών ,θεωρείται γλώσσα που προέρχεται ,κυρίως, από την Τεχνική Νοημοσύνη (ΤΝ είναι η μελέτη του πώς να κάνεις τους υπολογιστές να κάνουν πράγματα ,τα οποία οι άνθρωποι, αυτή τη στιγμή, κάνουν καλύτερα. Αυτός ο ορισμός , φυσικά , είναι εφήμερος, εξαιτίας της αναφοράς του στην τρέχουσα κατάσταση της τεχνολογίας της επιστήμης των υπολογιστών.) Ανήκει στην κατηγορία των λεγόμενων συναρτησιακών γλωσσών (functioning languages) στηρίζεται δηλαδή στην μαθηματική θεωρία των αναδρομικών κλήσεων. Βασική δομή δεδομένων στη LISP είναι η λίστα από όπου προέρχεται και το όνομα της ( LISt Processing). Δηλαδή οι επεξεργασίες σ’ ένα πρόγραμμα LISP είναι κατά βάση επεξεργασίες λιστών. Δεδομένου δε ότι μια λίστα μπορεί να περιέχει σύμβολα ή συμβολικές δομές, η LISP είναι κατάλληλη για επεξεργασία συμβόλων και συμβολικών δομών, δηλ. γι’ αυτό που ονομάζουμε συμβολικό υπολογισμό (symbolic computation). Ενώ ο αριθμητικός
  • 3. υπολογισμός (arithmetic computation) βασίζεται σε αριθμητικές πράξεις, ο συμβολικός υπολογισμός αναφέρεται στη δημιουργία και διαχείριση συμβολικών δομών. Αυτός είναι ο λόγος που η LISP έγινε (και είναι) η δημοφιλέστερη γλώσσα στην επιστημονική κοινότητα της Τεχνητής Νοημοσύνης. Τέλος, η LISP είναι μία διερμηνευτική γλώσσα (interpreted). Αυτό σημαίνει ότι αντί να μεταγλωττίζει πρώτα ό, τι γράφει ο χρήστης σε γλώσσα μηχανής και κατόπιν να εκτελεί το πρόγραμμα, εξετάζει το τι έχει γραφεί γραμμή προς γραμμή, καταλαβαίνει τι έχει ζητηθεί και μετά το εκτελεί. Το πλεονέκτημα αυτού έγκειται στο ότι ο προγραμματιστής μπορεί εύκολα και συχνά να κάνει αλλαγές και να τι δοκιμάζει , χωρίς να χρειάζεται να περιμένει το μεταγλωττιστή να μεταγλωττίσει ολόκληρο το πρόγραμμα κάθε φορά. Βέβαια το βασικό μειονέκτημα ότι είναι μία «αργή» γλώσσα. Ο πρώτος πλήρης μεταγλωττιστής για LISP, γραμμένος σε LISP, υλοποιήθηκε το 1962 από τον Tim Hart και τον Mike Levin στο ΜΙΤ. Η LISP γενικά θεωρείται μια εύκολη, ευέλικτη γλώσσα που μπορεί κάποιος εύκολα να μάθει διότι έχει σχετικά απλή σύνταξη και μία περιορισμένη βάση συντακτικού. Το γεγονός ακόμη, ότι η LISP χρησιμοποιούνταν σε ερευνητικά περιβάλλοντα, όπου η μεταφερσιμότητα δεν ήταν σημαντικός παράγοντας, οδήγησε στην ανάπτυξη πολυάριθμων διαλέκτων της LISP όπως η MACLISP, INTER LISP,muLISP κλπ. Παρ’ όλα αυτά τελευταία υπάρχει μια τάση για ενοποίηση των «διαλέκτων» αυτών. Η LISP υλοποιήθηκε για πρώτη φορά από τον Steve Russell σε ένα IBM 704 υπολογιστή. Λίγα λόγια για την επινόηση της LISP Ο John McCarthy ο άνθρωπος που εισήγαγε τη LISP, επινόησε επίσης και τον όρο «Τεχνητή Νοημοσύνη». Εξέφρασε το ενδιαφέρον του για τη συγκεκριμένη γλώσσα κατά τη διάρκεια του συνεδρίου του Dartmouth (1956,Hanover ) και ξεκίνησε μαζί με την ομάδα του να σχεδιάζει και να εφαρμόζει μία καλύτερη LISt Processing language. Το συνέδριο εκτίμησε την ανάγκη για μια νέα γλώσσα επεξεργασίας λιστών, στοχεύοντας στην αναδυόμενη περιοχή( emerging field) της Τεχνικής Νοημοσύνης.O McCarthy συνέχισε τις προσπάθειες του για την υποδειγματοποίηση της αυτής της νέας γλώσσας, βασίζοντας την στη FORTRAN . Χρησιμοποίησε έναν υπολογιστή ΙΒΜ 704 όπου κάθε εντολή αποτελείται από 4 μέρη: 2 μέρη διευθύνσεων, το πρόθεμα και την ετικέτα. Αυτά τα μέρη χρησιμοποιήθηκαν για την ανάκληση των περιεχομένων των διευθύνσεων της μνήμης που έδειχναν σε αυτές(διευθύνσεις) που αποτέλεσαν το αρχικό σχέδιο της LISP. Στη συνέχεια ο McCarthy ,κατά τη διάρκεια της υποδειγματοποίησης συνέταξε μια εργασία όπου αποδείκνυε πως θα μπορούσε να γραφεί μια γενική συνάρτηση της LISP η οποία θα
  • 4. μπορούσε να διερμηνεύει κάθε συνάρτηση (και την ίδια τη LISP, ως συνέπεια των χαρακτηριστικών της μηχανής Turing) δημιουργώντας έτσι τη συνάρτηση EVAL η οποία έγινε ο διερμηνευτής της γλώσσας. Η LISP γεννήθηκε! 2.Γενική δομή προγράμματος Οι λίστες είναι ο θεμελιώδης τύπος δεδομένων στη LISP. Οι λίστες είναι ο τύπος δεδομένων στη LISP. Γενικά οι δομές δεδομένων της LISP καλούνται Συμβολικές Εκφράσεις (s-expressions) . Αυτές οι συμβολικές εκφράσεις είναι τα άτομα ή οι ακολουθίες. Η LISP δεν απαιτεί δηλώσεις τύπων για τις μεταβλητές. Αυτό ελευθερώνει τον προγραμματιστή από τέτοιες λεπτομέρειες, αλλά δεν βοηθά στον έλεγχο του προγράμματος. Το μόνο που διαθέτει είναι τα ειδικά σύμβολα Τ (true) και NIL. Το NIL είναι ταυτόσημο με την κενή λίστα ‘()’ και αντιπροσωπεύει το ψεύδος μιας πρότασης, ενώ το Τ την αλήθεια. Μια λίστα είναι της μορφής (e1 e2 … en), όπου ei άτομο ή λίστα. Μπορεί να έχει απεριόριστο μήκος, δηλ. να έχει (θεωρητικά) άπειρα στοιχεία, και (θεωρητικά) απεριόριστο βάθος, δηλ. κάποια στοιχεία της να είναι λίστες, που περιέχουν άλλες λίστες κ .ο .κ. Μια συμβολοσειρά είναι μια ακολουθία χαρακτήρων, που συνήθως βρίσκεται σε διπλά εισαγωγικά. Σ-έκφραση Ακολουθία άτομο Αριθμός Σύμβολο Π.χ. x, b24,bet Λίστα π.χ. (1 2 a 3) , (a (12(3)) b (c d)) Συμβολοσειρά Π.χ. “Hello”, ”a”, “This is a string” Ακέραιος π.χ. 2, -58 Ρητός π.χ. 27/6 Πραγματικός Π.χ. 32.5,-1.9
  • 5. Η λίστα για παράδειγμα : (AYTH EINAI MIA SYMBOLIKH EKFRASH) Είναι μια λίστα που αποτελείται από 5 άτομα περικλειόμενα σε παρενθέσεις ενώ η ((ITALIA INTER) (AGGLIA LIVERPOOL)) Είναι μια λίστα αποτελούμενη από 2 υπολίστες. 3.Τύποι δεδομένων Όπως είναι φανερό και όπως προαναφέρθηκε η λίστα είναι η σημαντικότερη και βασικότερη δομή δεδομένων στη γλώσσα LISP καθώς αποτελεί το κύριο χαρακτηριστικό της και όλες τις οι λειτουργίες και δομές βασίζονται πάνω σε αυτές. -Ο Βρόχος READ-EVAL-PRINT (Ανάγνωση-εκτίμηση- εκτύπωση) Η Lisp διαβάζει τη σ-έκφραση και στη συνέχεια τυπώνει μια άλλη σ-έκφραση. Αυτή η διαδικασία ονομάζεται βρόχος READ-EVAL- PRINT. Η συνάρτηση EVAL είναι το κεντρικό τμήμα της γλώσσας LISP .Σκοπός της είναι να εκτιμήσει τις σ-εκφράσεις, οι οποίες θεωρούνται ορίσματα της. Τα ψηφία και τα Τ και NIL θα εκτιμηθούν στους εαυτούς τους. Τα ψηφία είναι αριθμητικά άτομα και εκτιμούνται στις αντίστοιχες τιμές τους. Παραδείγματα: $4 ;Το 4 είναι ένα αριθμητικό άτομο που 4 ;εκτιμάται στην εαυτό του. $t ;Είναι ένα αριθμητικό συμβολικό άτομο που T ; εκτιμάται στον εαυτό του. $(+ 4 5) ;Τα ορίσματα 4 και 5 εκτιμούνται πριν η 9 ; συνάρτηση + κληθεί Τα εισαγωγικά όμως (απόστροφος) κάνουν τα σύμβολα να εκτιμούνται στους εαυτούς τους κι όχι στις λίστες. Δηλαδή : $’ ( + 4 5) (+ 4 5)
  • 6. Καλό είναι πριν από κάθε read να υπάρχει εκτύπωση κάποιου μηνύματος που να πληροφορεί τον χρήστη ότι πρέπει κάτι να πληκτρολογήσει. Αυτό γίνεται με τη χρήση της συνάρτησης εξόδου print. Αν εκτελέσουμε την παρακάτω έκφραση $ (print ‘(Give a number)) το αποτέλεσμα θα είναι (GIVE A NUMBER) ;αυτό είναι το αποτέλεσμα της ενέργειας της print ‘Ένα παράδειγμα με συνάρτηση και κλήση είναι το εξής: (defun print-what-type () (print ‘(please type a number :)) (setf num (read)) (print (append ‘(you typed) (list num)))) $(print-what-type) $(PLEASE TYPE A NUMBER) 45 Για μία πιο «προσεγμένη» εκτύπωση μπορεί να χρησιμοποιηθεί η συνάρτηση format t η οποία παρατίθεται παρακάτω. -Θεμελιώδη στοιχεία λιστών Πρέπει να υπάρχει μια δεξιά παρένθεση για κάθε αριστερή ώστε να επιτυγχάνεται η λεγόμενη ισορροπημένη λίστα. Παράδειγμα: (XRHSTOS ALIKH SPYROS ANNA) αυτή είναι μια απλή λίστα, ενώ η: (MPOREIS NA EXEIS LISTES (MESA SE) LISTES). Είναι μια θυλακωτή λίστα. -() κενή λίστα ή για τη LISP ο τύπος NIL .Αυτό που προκαλεί σύγχυση πολλές φορές είναι το γεγονός ότι το NIL μπορεί να είναι σύμβολο και κενή λίστα ταυτόχρονα. Μία κωδικοποιημένη λίστα:
  • 7. Το NIL σημαίνει ότι η λίστα τελειώνει και δεν μπορεί να αντιμετωπιστεί σαν στοιχείο στη λίστα. Από τη σκοπιά της συμβολικής επεξεργασίας οι λίστες είναι θεμελιώδεις. Από τη στιγμή που μπορούν να είναι οποιουδήποτε μεγέθους, μπορούν εύκολα να απεικονίζουν πληροφορίες οποιασδήποτε πολυπλοκότητας: (NIKOS (YPSOS 1.75) (BAROS 75) (EPAGGELMA (LEKTORAS PANEPHSTHMIOY))) Εντολή (συνάρτηση) εκχώρησης Η διαδικασία της παραχώρησης μια τιμής σε ένα σύμβολο ονομάζεται εκχώρηση. Αυτή η διαδικασία αντικαθίσταται από τη συνάρτηση SETQ. H SETQ έχει σαν αποτέλεσμα, το δεύτερο όρισμα να γίνεται η τιμή του πρώτου ορίσματος, το οποίο πρέπει να είναι συμβολικό άτομο. Παραδείγματα χρήσης: $(SETQ XRHSTOS ‘XRHSTOS) XRHSTOS $L ;Η τιμή που επιστρέφεται από (A B) ; την SETQ είναι η τιμή που ;δίνεται στο πρώτο όρισμα. $L ;Από εδώ και στο εξής το L θα αναφέρεται στη (A B) ;λίστα (Α Β) μέχρι να αλλαχτεί η τιμή του. $SETQ PAPADOPOYLOS ‘(ANNA DHMHTRHS NTENHS)) (ANNA DHMHTRHS NTENHS) ;Η τιμή που επιστρέφεται από ;τη SETQ είναι η τιμή που
  • 8. ;δίνεται στο πρώτο όρισμα. $PAPADOPOULOS (ANNA DHMHTRHS NTENHS) Η συνάρτηση SET είναι όμοια με τη SETQ ,με τη διαφορά ότι σε αυτή και τα δύο ορίσματα εκτιμούνται: $(SET FONHENTA ‘(A E I O Y )) ;Το συμβολικό όνομα FONHENTA (A E I O Y) ;είναι σε μορφή αποστρόφων. $(SET LISTA FONHENTA) (A E I O Y) $LISTA (A E I O Y) Η LISP επιπλέον, επιτρέπει τη δημιουργία νέων τύπων δεδομένων με τη μορφή των λεγόμενων δομών (structures). Μια δομή αποτελείται από πεδία (fields) και τιμές (values) των πεδίων. Η δημιουργία μιας δομής γίνεται με τη βοήθεια του defstruct ως εξής: (defstruct <structure name> (<field1> <value1) (<field2> <value2) (<fieldn> <valuen)) Η defstruct δημιουργεί μια δομή, ένα καλούπι, αλλά όχι στιγμιότυπα της δομής. Δημιουργεί όμως μαζί με τη δομή και μια συνάρτηση- δημιουργό στιγμιότυπων. Αυτή η συνάρτηση έχει όνομα make- <structure name>, δηλ. για την παραπάνω δομή είναι η make- student. Μ’ αυτή μπορούμε να δημιουργήσουμε στιγμιότυπα της δομής student. Π.χ. η $ (setf maria (make-student)) #S(STUDENT :YEAR NIL :SEX NIL :PERFORMANCE NIL) δημιουργεί ένα στιγμιότυπο με όνομα MARIA με τιμές πεδίων τις αρχικές (εξ’ ορισμού) τιμές.
  • 9. Επίσης, η defstruct δημιουργεί και συναρτήσεις ανάγνωσης, για την προσπέλαση των τιμών των πεδίων. Αυτές έχουν σαν όνομα το <structure name>-<field name>, δηλ. στην περίπτωσή μας θα είναι οι student-year, student-sex και student-performance. Τώρα # (student-sex maria) NIL 4. Τελεστές Βασικών πράξεων +,-,/,*,float Π.χ. $ (/ 27 9) 3 $ (/ 4.16 1.3) 3.2 $ (/ 22 7) 22/7 $ (float (/ 22 7)) 3.14... (Αριθμητικές Συναρτήσεις ) Υπολογισμών • round, max, min, expt, sqrt, abs Π.χ. $ (max 2 4 3) 4 $ (min 2 4 3) 2 $ (expt 2 3) 8 ;δηλ. 23 $ (sqrt 6.25) 2.5 $ (abs –5.5) 5.5 $ (round (/ 22 7))
  • 10. 3 ;πλησιέστερος ακέραιος, πρώτη γραμμή 1/7 ; υπόλοιπο, δεύτερη γραμμή $ (setf x (round (/ 22 7))) 3 $ x 3 Αναγνώρισης zerop: επιστρέφει Τ αν το όρισμά του έχει τιμή ‘0’ plusp: επιστρέφει Τ αν το όρισμά του είναι θετικός αριθμός minusp: επιστρέφει Τ αν το όρισμά του είναι αρνητικός αριθμός evenp: επιστρέφει Τ αν το όρισμά του είναι άρτιος (ακέραιος) αριθμός oddp: επιστρέφει Τ αν το όρισμά του είναι περιττός (ακέραιος) αριθμός > : επιστρέφει Τ αν τα ορίσματά του (τουλάχιστον 2) είναι κατά φθίνουσα σειρά < : επιστρέφει Τ αν τα ορίσματά του (τουλάχιστον 2) είναι κατ’ αύξουσα σειρά 5.Θέματα σύνταξης Το συντακτικό της LISP περιλαμβάνει τα εξής στοιχεία: • ( :Η αριστερή παρένθεση σηματοδοτεί την αρχή μιας λίστας • ) :Η δεξιά παρένθεση σηματοδοτεί το τέλος μιας λίστας ,για παράδειγμα ( Α Β Γ ) • ‘ :Το εισαγωγικό (απόστροφος) αποτρέπει την εκτίμηση της σ-έκφρασης (s-expression) που ακολουθεί. • ; :Το ερωτηματικό επιτρέπει τα σχόλια στη LISP .Όλοι οι χαρακτήρες μετά από αυτό αγνοούνται. • “ :Οι συμβολοσειρές περικλείονται σε διπλές αποστρόφους. Π. χ. (PRINC “ALIKH ANNA”) εκτυπώνει ALIKH ANNA| ALIKH ANNA| • : Ο χαρακτήρας backlash (ανάστροφη κάθετος) επιτρέπει να αντιμετωπιστεί ο επόμενος χαρακτήρας σα γράμμα και όχι σαν συντακτική τιμή. Για παράδειγμα οι διπλές απόστροφοι μπορούν να αντιμετωπιστούν σαν συμβολοσειρά με το να τοποθετηθεί ο χαρακτήρας backlash. Για παράδειγμα στην έκφραση ««ΓΕΙΑ»» διαβάζει «ΓΕΙΑ». • ~% :αλλαγή γραμμής Όσον αφορά την ονοματολογία μεταβλητών στη LISP μπορούν να χρησιμοποιηθούν όλα τα γράμματα του λατινικού αλφαβήτου
  • 11. κεφαλαία και μικρά ενώ θα πρέπει φυσικά να δίνεται ιδιαίτερη προσοχή στις δεσμευμένες λέξεις (οι οποίες αναφέρονται στην πορεία της παρουσίασης). Επίσης, οι μεταβλητές που έχουν αναφερθεί και θα αναφερθούν παρακάτω έχουν τοπική εμβέλεια όμως, συχνά είναι απαραίτητη η ύπαρξη μεταβλητών καθολικής εμβέλειας, δηλαδή μεταβλητών που να είναι ορατές από όλες τις συναρτήσεις ενός προγράμματος. Αυτό επιτυγχάνεται με τη devfar: (defvar <όνομα-μεταβλητής>) 6.Συναρτήσεις -Συναρτήσεις της γλώσσας ΣΥΝΑΡΤΗΣΕΙΣ ΠΡΟΣΠΕΛΑΣΗΣ-ΣΥΝΘΕΣΗΣ-ΤΡΟΠΟΠΟΙΗΣΗΣ- ΑΝΑΓΝΩΡΙΣΗΣ ΤΥΠΩΝ-ΣΥΓΚΡΙΣΗΣ-ΣΥΜΜΕΤΟΧΗΣ-ΕΚΤΥΠΩΣΗΣ
  • 12. ΟΝΟΜΑ ΣΥΝΤΑΞΗ ΛΕΙΤΟΥΡΓΙΑ (ΤΙ ΕΠΙΣΤΡΕΦΕΙ) ΠΑΡΑΔΕΙΓΜΑ Car (car<list>) το πρώτο στοιχείο της λίστας $(car ‘(1 2 3)) 1 Cdr (cdr<list>) τη λίστα χωρίς το πρώτο στοιχείο της $(cdr ‘(1 2 3)) 2 3 Cxxxxr (x ≡ a, d) Με τη σύνταξη αυτή δίνεται η δυνατότητα πραγματοποίησης πολλών συνδυασμών- συναρτήσεων, εναλλάσσοντας ‘a’ και ‘d’ (caadr lista) ≡ (car (car (cdr lista))) (cdadr lista) ≡ (cdr (car (cdr lista))) last (last <list>) Τη λίστα με μόνο το τελευταίο στοιχείο $ (last ‘(1 2 3)) (3) butlast (butlast <list> <n>) Τη λίστα χωρίς τα τελευταία n στοιχεία $(butlast ‘(1 2 3 4) 2) (1 2 ) Nthcdr (nthcdr <n> <list>) Τη λίστα χωρίς τα πρώτα n στοιχεία $ (nthcdr 2 ‘(1 2 3 4)) (3 4) Length (length <list>) Το μήκος της λίστας (ακέραιος). $ (length ‘(a 2 b)) 3 Reverse (reverse <list>) Την ανάστροφη λίστα $ (reverse ‘(1 2 3)) (3 2 1) Cons (cons <atom> <atom>) ή (cons <list> <atom>) Το αντίστοιχο ζεύγος $ (cons ‘x ‘a) (X . A) List (list <s- expression>*) (Το * σημαίνει μία ή περισσότερες επαναλήψεις) Μια λίστα που περιέχει τις <s- expression> $ (list ‘a ‘(2 3) ‘b) (A (2 3) B) Append (append <list>*) (Το * σημαίνει μία ή περισσότερες επαναλήψεις) Μια λίστα που συγχωνεύει όλες τις <list>. $ (append ‘(a b) ‘(c) ‘(d)) (A B C D) Push (push <s- expression> <symbol>), όπου το <symbol> έχει σαν τιμή μια λίστα Τη λίστα με επί πλέον πρώτο στοιχείο την <s- expression> $x (A B C) $ (push 1 x) (1 A B C)* x → (1 A B C) pop (pop <symbol>), όπου το <symbol> έχει σαν τιμή μια λίστα Τη λίστα με χωρίς πρώτο στοιχείο της Η τιμή του <symbol> γίνεται η νέα λίστα. $x (1 A B C) $ (pop x) (A B C) x (A B C) eq (<eq-fun> <argum1> <argum2> (γενική Τ όταν πρόκειται για δύο ίδια σύμβολα. $(eq ‘exit ‘exit) T
  • 13. -Oι παραπάνω ήταν οι συναρτήσεις της ίδιας της γλώσσας προγραμματισμού οι οποίες είναι σαφώς απαραίτητες για την επεξεργασία των λιστών, την τροποποίηση τους, για σύγκριση μεταξύ των στοιχείων τους κλπ. Κάτωθι παρουσιάζεται πώς μπορεί ο χρήστης να ορίσει μια συνάρτηση σε ένα πρόγραμμα κι αυτό γίνεται με τη βοήθεια της defun: (defun <function-name> (<param1> … <paramn>) <form1> … <formm>) όπου <function-name> είναι το όνομα της συνάρτησης που θέλουμε να ορίσουμε, τα <parami> είναι τα ορίσματα ή τυπικές παράμετροι της συνάρτησης και τα <formi> είναι συναρτησιακοί τύποι. Π.χ. ο παρακάτω κώδικας LISP ορίζει μια συνάρτηση mesos-oros, που έχει δύο ορίσματα (num1 και num2) και υπολογίζει το μέσο όρο των ορισμάτων της. $(defun mesos-oros (num1 num2) (/ (+ num1 num2) 2)) Κλήση Μια κλήση της παραπάνω συνάρτησης είναι: $(mesos-oros 5 3) 4 Η συνάρτηση let χρησιμοποιείται για ανάθεση (αρχικών) τιμών σε μεταβλητές. Η σύνταξή της έχει ως εξής: (let ((<param1> <init-value1>) (<param2> <init-value2>) . . . (<paramn> <init-valuen>)) <form1> …
  • 14. <formn>) Στην παραπάνω δομή, εκτιμώνται τα <init-value1>, <init- value2>, ... <init-valuen> και τα αποτελέσματά τους καταχωρούνται στα <param1>, <param2>, ... <paramn> αντίστοιχα. 7.Δομές διακλάδωσης Διάταξη if Η διάταξη if έχει την παρακάτω σύνταξη: (if <condition> <then form> [<else form>]) όπου ότι υπάρχει μεταξύ ‘[’ και ‘]’ είναι προαιρετικό. Η λειτουργία της έχει ως εξής: Εκτιμάται η συνθήκη <condition>. Αν το αποτέλεσμα είναι διάφορο του NIL, εκτιμάται η έκφραση <then form> και επιστρέφεται η τιμή της, αλλιώς εκτιμάται η <else form>, αν υπάρχει, και επιστρέφεται η τιμή της, αλλιώς (δηλ. αν δεν υπάρχει) επιστρέφεται NIL. Διάταξη cond Η διάταξη cond έχει την παρακάτω σύνταξη: (cond (<condition1> [<action1-1>, <action1-2>, ... <action1-n>]) (<condition2> [<action2-1>, <action2-2>, ... <action2-n>]) . . . (<conditionm> [<actionm-1>, <actionm-2>, ... <actionm-n>])) όπου τα <actioni-j> είναι προαιρετικά. Η λειτουργία της έχει ως εξής: Εκτιμώνται οι συνθήκες <condition1>, …, <conditionm> με τη σειρά. Με το πρώτο <conditioni> που θα δώσει αποτέλεσμα διάφορο του NIL, εκτιμώνται οι αντίστοιχες εκφράσεις ενέργειας <actioni-j> και επιστρέφεται η τιμή της τελευταίας. Αν δεν υπάρχουν εκφράσεις ενέργειας, αυτό που επιστρέφεται είναι το αποτέλεσμα του <conditioni>. Αν καμία
  • 15. συνθήκη δεν δώσει αποτέλεσμα διάφορο του NIL, τότε επιστρέφει NIL. Διάταξη case Η διάταξη case έχει την παρακάτω σύνταξη: (case <key term> (<key1> <action1-1>[, <action1-2>, ... <action1-n>]) (<key2> <action2-1>[, <action2-2>, ... <action2-n>]) . . . (<keym> <actionm-1>[, <actionm-2>, ... <actionm-n>])) Η λειτουργία της έχει ως εξής: Εκτιμάται ο <key form> και συγκρίνεται με καθένα από τα <key1>, …, <keym> (χωρίς εκτίμηση) με τη σειρά με βάση το κατηγόρημα (συνάρτηση) σύγκρισης eql. Με το πρώτο <keyi> για το οποίο η σύγκριση θα δώσει αποτέλεσμα Τ, εκτιμώνται οι αντίστοιχες εκφράσεις ενέργειας <actioni-j> και επιστρέφεται η τιμή της τελευταίας. Αν καμία σύγκριση δεν δώσει αποτέλεσμα Τ, τότε επιστρέφει NIL, εκτός εάν η τελευταία πρόταση της case έχει σαν <keym> το “otherwise” ή το “t”, οπότε εκτελούνται οι ενέργειές της. 8.Δομές επανάληψης Διάταξη dotimes Η διάταξη dotimes έχει την παρακάτω σύνταξη: (dolist (<parameter> <up-bound form> [<result form>]) <form1> … <formn>) Η λειτουργία της έχει ως εξής: Εκτιμάται το <up-bound form>, που πρέπει να έχει σαν αποτέλεσμα ένα αριθμό, έστω n. Στη συνέχεια, αποδίδονται οι ακέραιες τιμές 0 … n-1 στην <parameter> διαδοχικά. Για κάθε τιμή εκτελούνται τα <form1> … <formn>. Τέλος, εκτιμάται το <result form> και επιστρέφεται η τιμή του. Αν δεν υπάρχει <result form>, επιστρέφεται NIL.
  • 16. Διάταξη dolist Η διάταξη dolist έχει την παρακάτω σύνταξη: (dolist (<parameter> <list form> [<result form>]) <form1> … <formn>) Η λειτουργία της έχει ως εξής: Εκτιμάται το <list form>, που πρέπει να έχει σαν αποτέλεσμα λίστα. Στη συνέχεια αποδίδονται τα στοιχεία της λίστας ένα-ένα σαν τιμές στο <parameter>. Σε κάθε απόδοση τιμής εκτελούνται τα <form1> … <formn>. Τέλος εκτιμάται το <result form> και το αποτέλεσμά του επιστρέφεται σαν αποτέλεσμα της διάταξης. Αν δεν υπάρχει <result form>, επιστρέφεται NIL. Διάταξη do Η διάταξη do είναι συνθετότερη της dolist, αλλά και με περισσότερες δυνατότητες. Η σύνταξή της είναι η εξής: (do ((<param1> [<init-val1> [<update-form1>]]) . . . (<paramn> [<init-valn> [<update-formn>]])) (<termin-test> [[<intermed-form>*] <result-form>]) <form1> … <formn>) όπου ένα ή περισσότερα <intermed-form> δεν μπορούν να υπάρχουν αν δεν υπάρχει <result-form>. Η λειτουργία της έχει ως εξής: Εκτιμώνται τα <init-vali> και καταχωρούνται στις αντίστοιχες παραμέτρους (παράλληλα). Εξετάζεται το <termin-test>. Αν είναι NIL (δηλ. δεν αληθεύει), εκτελείται το σώμα (<form1> … <formn>). Στη συνέχεια εκτιμώνται τα <update-formi> και τα αποτελέσματά τους αποδίδονται στις αντίστοιχες παραμέτρους (παράλληλα). Κατόπιν, εξετάζεται το <termin-test> κ. ο .κ. Αν το <termin-test> βρεθεί να αληθεύει (είναι δηλ. Τ), τότε εκτιμώνται τα <intermed- form>, αν υπάρχουν, και το <result-form>, αν υπάρχει. Επιστρέφεται δε το αποτέλεσμα του <result-form>. Αν δεν υπάρχει <result-form>, επιστρέφεται NIL.
  • 17. Διάταξη loop Μια άλλη διάταξη επανάληψης, που δεν χρησιμοποιείται όμως συχνά, είναι η loop, που έχει την εξής σύνταξη: (loop <form1>, <form2>, ..., <formn>) Στη διάταξη αυτή τα <form1>, <form2>, ..., <formn> εκτελούνται συνεχώς με τη σειρά αναγραφής, μέχρις ότου εκτελεστεί κάποια πρόταση return, οπότε και επιστρέφεται το αποτέλεσμά της. 9.Πίνακες Η δημιουργία ενός μονοδιάστατου πίνακα στη LISP γίνεται ως εξής: (setf <array name> (make-array <dimension>)) Π.χ. η $ (setf students (make-array 4)) #(0 0 0 0) ;(αυτός είναι ο τρόπος που η LISP παρουσιάζει ένα πίνακα στην οθόνη) δημιουργεί ένα μονοδιάστατο πίνακα με όνομα students που έχει 4 στοιχεία. Τα στοιχεία ενός πίνακα στη LISP αριθμούνται από το 0 (εδώ από 0-3). Αν δεν αρχικοποιήσουμε ένα πίνακα, τότε δίνονται μηδενικά στοιχεία. Επίσης, πρέπει να σημειώσουμε ότι τα στοιχεία ενός πίνακα στη LISP μπορεί να είναι οτιδήποτε, δηλ. και ετερογενή. Δεν απαιτείται όπως σε άλλες γλώσσες να είναι κοινού τύπου. Η αρχικοποίηση ενός πίνακα μπορεί να γίνει με διάφορους τρόπους. (α) Με τη χρήση της παραμέτρου :initial-element κατά τη δημιουργία του πίνακα. Π.χ. $ (set students (make-array 4: initial-element NIL)) # (NIL NIL NIL NIL) ή $ (set students (make-array 4: initial-element ‘a)) #(A A A A) (β) Με τη χρήση της παραμέτρου :initial-contents κατά τη δημιουργία του πίνακα.
  • 18. Π.χ. $ (set students (make-array 4: initial-contents ‘(a b c d))) # (A B C D) (γ) Με την ανάθεση τιμών σε κάθε στοιχείο του μέσω της aref. Π.χ. $ (set (aref students 0) ‘a) A $ (set (aref students 1) ‘b) B κλπ. Η προσπέλαση των στοιχείων ενός πίνακα γίνεται ως εξής: (aref <array name> <element index>) Π.χ. $ (aref students 1) B ;(αναφερόμενοι στην τελευταία αρχικοποίηση) Ο ορισμός δισδιάστατου πίνακα γίνεται κατά αντίστοιχο τρόπο: (set <array name> (make-array <dimensions>)) Π.χ. η $ (setf marks (make-array ‘(2 3))) #2A((0 0 0) (0 0 0)) δημιουργεί ένα δισδιάστατο πίνακα με όνομα marks που έχει 2x3=6 στοιχεία. Η αρχικοποίηση ενός δισδιάστατου πίνακα μπορεί να γίνει με τους ίδιους ακριβώς τρόπους όπως και ένας μονοδιάστατος. Βιβλιογραφία: 1. G. L. Steele JR, “Common Lisp, The Language”, Digital Ρress, 1984 2. ANSI-Common LISP – Paul Graham ,Prentice hall New Jersey 1996
  • 19. 3. LISP in small pieces – Christian Queinnec Cambridge University Press 1996 4. Έμπειρα συστήματα – Τεχνητή Νοημοσύνη και LISP - Γεώργιος Δουκίδης, Μάριος Αγγελίδης Εκδόσεις Ι. Σιδέρης 2003 5. Εγκυκλοπαίδεια ΥΔΡΙΑ 6. http://en.wikipedia.org/wiki/Lisp_(programming_language)