LISP
LISP
Standard języka LISP
Standard języka LISP
Komputerowe Wspomaganie
Komputerowe Wspomaganie
Projektowania
Projektowania
LISP
LISP
Struktura Listy
Struktura Listy
(abc de fgh)
(abc de fgh)
Separator -
Spacja
Separator -
Spacja
Element Listy -
Atom
Element Listy -
Atom
Początek Listy:
(
Początek Listy:
(
Koniec Listy: )
Koniec Listy: )
Podstawowym wyróżnikiem składni języka LISP
oraz podstawową strukturą danych jest
LISTA
Znaczniki początku i końca listy są naturalnymi separatorami.
LISP
LISP
Lista: Struktura dynamiczna
Lista: Struktura dynamiczna
lista
X
X
A
A
/
/
B
B
/
/
C
C
/
/
0
0
01
111 1
0
0
01
101 1
0
0
01
110 1
1
0
01
011 1
0
1
11
110 1
0
0
01
111 1
0
0
01
101 1
0
0
01
110 1
1
0
01
011 1
0
1
11
110 1
Wartość
Wartość
Identyfikator
Identyfikator
Wskazanie (pointer)
Wskazanie (pointer)
?
?
0
0
01
111 1
0
0
01
101 1
0
0
01
110 1
1
0
01
011 1
0
1
11
110 1
/
/
Wskazanie puste: NIL
10
10
/
/
Wartość = 10
Wskazanie puste: NIL
?
?
0
0
01
111 1
0
0
01
101 1
0
0
01
110 1
1
0
01
011 1
0
1
11
110 1
Anonimowa zmienna przechowująca dwa wskazania:
- wartość
- inna zmienna
zmienna
LISP
LISP
Lista: Struktura dynamiczna
Lista: Struktura dynamiczna
Głowa Listy: A
Ogon Listy: (B C)
Głowa Ogona Listy: B
Ogon Ogona Listy: (C)
Głowa
Listy
Głowa
Listy
Head
Ogon Listy
Ogon Listy
B
C
/
/
Tail
A
B
C
/
/
Lista: (A B C)
Lista
(C)?
LISP
LISP
Lista: Struktura dynamiczna
Lista: Struktura dynamiczna
Lista zagnieżdżona: (A (B C) D)
A
D
/
/
Lista
B
C
/
/
Stopień zagnieżdżenia listy jest teoretycznie
nieograniczony
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja języka LISP ma postać listy
Instrukcja języka LISP ma postać listy
Instrukcja Przypisania:
(
setq
x 5)
Głowa listy:
funkcja
predefiniowana
operator
funkcja użytkownika
Ogon listy:
lista argumentów
adekwatna do
funkcji lub operatora
Instrukcja zagnieżdżona, Ewaluacja:
(
setq
y (
setq
x 5))
(
setq
z y)
y=5
y=5
z=5
z=5
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Przypisania:
(
setq
x (A B C))
Głowa listy:
funkcja
predefiniowana
operator
funkcja użytkownika
Ogon listy:
lista argumentów
adekwatna do
funkcji lub operatora
Błąd: Brak funkcja (Error: null function)
Błąd: Brak funkcja
(Error: null function)
Głowa listy:
funkcja
predefiniowana?
Operator?
funkcja użytkownika?
Ogon listy:
lista argumentów
adekwatna do
funkcji lub operatora
(A B C)
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Cytowania:
(
quote
x)
(
quote
(A B C))
Uprawniona Instrukcja Przypisania:
(
setq
x (
quote
(A B C)))
Symbol X
Symbol X
Lista (A B C)
Lista (A B C)
Instrukcja Wymuszonej Ewaluacji:
(
eval
x)
Błąd: Brak funkcja (Error: null function)
Błąd: Brak funkcja
(Error: null function)
Uprawniona Instrukcja Ewaluacji Listy:
(
eval
(
quote
x)) (
eval
‘
x)
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Tworzenia Listy:
(
list
x y z)
Ogon listy:
lista argumentów
dowolnego
typu
Rezultat: (nil nil nil)
x, y, z podczas tworzenia listy traktowane są jako
identyfikatory zmiennych podlegających ewaluacji.
Wskazanie na wartość zmiennej jest puste - NIL
(
setq
x 2) (
setq
y 2.3)(
setq
z -1.5)
Rezultat: (2 2.3 -1.5)
(
list
x y z)
Uwaga: Wykonanie instrukcji (list x y z) spowoduje utworzenie listy (2 2.3 -1.5)
To tylko tyle! Komputer się narobi a my nie mamy z tego żadnego pożytku.
Należy wykonać instrukcję przypisania: (setq P (list x y z))
Uwaga: Wykonanie instrukcji (list x y z) spowoduje utworzenie listy (2 2.3 -1.5)
To tylko tyle! Komputer się narobi a my nie mamy z tego żadnego pożytku.
Należy wykonać instrukcję przypisania: (setq P (list x y z))
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcje Dostępu do Listy:
(
car
lista)
(
cdr
lista)
B
C
/
/
A
B
C
/
/
Lista: (A B C)
c
A
r , c
D
r c....r (c
ad
r x), (c
add
r
x)...
Instrukcje Zagnieżdżone:
(car (cdr lista)) = (
cadr
lista) = B
(car (cdr (cdr lista))) = (
caddr
lista) = C
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Tworzenia Pary Kropkowej:
Specjalny Rodzaj Listy: (A . B)
(dotted pair)
(
cons
A B)
A
B
Przykłady: (cons ‘x ‘y)
(X . Y)
(cons ‘x ‘(y))
(X Y)
(cons ‘(x y) ‘z)
((X Y) . Z)
Komentarz: Drugi przykład wskazuje na możliwość uzupełnienia listy
przez wstawienie elementu na początku listy.
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Uzupełniania Listy:
(
append
lista1 lista2)
Ogon listy:
lista argumentów typu LIST
typu LIST
Przykłady: (append ‘() ‘(x y))
(X Y)
(append ‘(x y) ‘(z))
(X Y Z)
(append ‘(x y) ‘z)
Błąd: Zły typ argumentu (Error: bad argument type)
Błąd: Zły typ argumentu
(Error: bad argument type)
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Warunkowa:
(
if
warunek (instrukcja))
Instrukcja warunkowa prosta:
Jeżeli
warunek
ma wartość
prawda (T)
wykonaj instrukcję.
(
if
warunek (instrukcja1)
(instrukcja2))
Instrukcja warunkowa złożona:
Jeżeli
warunek
ma wartość
prawda (T)
wykonaj
instrukcję 1
w przeciwnym przypadku wykonaj instrukcję 2.
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Warunkowa Zagnieżdżona:
(
cond
(
warunek1
(Blok
(Blok
Instrukcji)
Instrukcji)
)
(
warunek2
(Blok
(Blok
Instrukcji)
Instrukcji)
)
...
(
T
(Blok Instrukcji)
(Blok Instrukcji)
)
)
Jeżeli kolejny z
warunków
ma wartość
prawda
(T)
wykonany zostaje blok instrukcji zawarty w
liście
(
warunek
(Blok Instrukcji)
(Blok Instrukcji)
).
Następujące po nim
warunki
nie są
sprawdzane.
Opcjonalnie
Opcjonalnie
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Instrukcja Pętli:
(
while
warunek
(Blok Instrukcji)
(Blok Instrukcji)
)
Dopóki
warunek
ma wartość
prawda
(T)
wykonuj (Blok Instrukcji)
(Blok Instrukcji)
Uwaga: Początkowa wartość warunku wynosząca T(prawda) umożliwia
realizację pętli. Instrukcje wykonywane wewnątrz pętli muszą
zmieniać wartość warunku tak aby możliwe było wyjście z pętli.
Uwaga: Początkowa wartość warunku wynosząca T(prawda) umożliwia
realizację pętli. Instrukcje wykonywane wewnątrz pętli
muszą
zmieniać wartość warunku tak aby możliwe było wyjście z pętli.
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Arytmetyka LISP
(
+
x y)
Głowa listy:
operator
Ogon listy:
lista argumentów
typu numerycznego
2
3
12
5
.
1
5
.
2
5
(/ (* (+ 5 2.5 1.5) 12) (+ 3 2))
(/ (* (+ 5 2.5 1.5) 12) (+ 3 2))
Uwaga: Jeżeli wszystkie argumenty są typu całkowitego, to wynik operacji
jest również typu całkowitego. Jeżeli choć jeden argument jest typu
rzeczywistego, to wynik jest typu rzeczywistego
Uwaga: Jeżeli wszystkie argumenty są typu całkowitego, to wynik operacji
jest również typu całkowitego. Jeżeli choć jeden argument jest typu
rzeczywistego, to wynik jest typu rzeczywistego
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Funkcja Użytkownika:
(
defun
Nazwa_Funkcji
(
argumenty
/
zmienne_lokalne
)
(Blok Instrukcji)
(Blok Instrukcji)
)
Nazwa funkcji: nie może zawierać znaku
SPACJA
SPACJA
Lista argumentów i zmiennych lokalnych:
• obligatoryjny element definicji funkcji
obligatoryjny element definicji funkcji
• argumenty: Lista argumentów formalnych
• znak /
(slash)
: Separator argumentów i zmiennych lokalnych.
Przed i po znaku
slash
muszą być
spacje
.
Występuje opcjonalnie.
• zmienne lokalne: Lista zmiennych używanych w bloku
instrukcji. To jest dobry zwyczaj!
LISP
LISP
Lista: Instrukcja Języka
Lista: Instrukcja Języka
Funkcja Użytkownika:
(
defun
Nazwa_Funkcji
(/
zmienne_lokalne
)
)
(Blok
(Blok
Instrukcji)
Instrukcji)
)
(
defun
Nazwa_Funkcji
()
(Blok Instrukcji)
(Blok Instrukcji)
)
(
defun
Nazwa_Funkcji
(
argumenty
)
(Blok Instrukcji)
(Blok Instrukcji)
)
Wynikiem funkcji jest wynik ostatniej instrukcji w bloku
Wynikiem funkcji jest wynik ostatniej instrukcji w bloku
(defun Radian (deg)(/ (* deg PI)
180))
(defun Radian (deg)(/ (* deg PI)
180))
(defun PIx2 (rad)
(if (< rad 0)
(+ (* 2 PI) rad)
(eval rad))
)
(defun PIx2 (rad)
(if (< rad 0)
(+ (* 2 PI) rad)
(eval rad))
)
(defun Rad0_2PI (deg /
rad)
(setq rad (Radian deg))
(Pix2 rad)
)
(defun Rad0_2PI (deg /
rad)
(setq rad (Radian deg))
(Pix2 rad)
)