background image

 

 

LISP

LISP

Standard języka LISP

Standard języka LISP

Komputerowe Wspomaganie 

Komputerowe Wspomaganie 

Projektowania

Projektowania

background image

 

 

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.

background image

 

 

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

background image

 

 

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)?

background image

 

 

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

background image

 

 

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

background image

 

 

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)

background image

 

 

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) 

background image

 

 

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))

background image

 

 

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

background image

 

 

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.

background image

 

 

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)

background image

 

 

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. 

background image

 

 

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

background image

 

 

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.

background image

 

 

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

background image

 

 

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!

background image

 

 

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)
)


Document Outline