Common LISP Instrukcje Sterujące

Podobne dokumenty
Common Lisp - funkcje i zmienne

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Programowanie - wykład 4

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Bloki anonimowe w PL/SQL

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Liczby losowe i pętla while w języku Python

Elementy języka Scheme

7. Pętle for. Przykłady

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

4. Funkcje. Przykłady

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Wskazówki dotyczące zmiennych, tablic i procedur 1

1 Podstawy c++ w pigułce.

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Pętle. Dodał Administrator niedziela, 14 marzec :27

PL/SQL. Część 1 Bloki PL/SQL. Piotr Medoń

Konstrukcje warunkowe Pętle

1 Podstawy c++ w pigułce.

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Pętla for. Wynik działania programu:

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Elementy języka Scheme

Programowanie w Turbo Pascal

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Programowanie komputerowe. Zajęcia 3

Java Podstawy. Michał Bereta

Wykład 8: Obsługa Wyjątków

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Zapis algorytmów: schematy blokowe i pseudokod 1

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Definicje wyższego poziomu

Podstawy Programowania C++

Oracle PL/SQL. Paweł Rajba.

Plan wykładu BAZY DANYCH II WYKŁAD 3. Zasięg zmiennych. Zasięg zmiennych

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Tablice, funkcje - wprowadzenie

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Składowane procedury i funkcje

System operacyjny Linux

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Pętle. Programowanie komputerowe

Blockly Kodowanie pomoc.

PL/SQL. Zaawansowane tematy PL/SQL

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

15. Funkcje i procedury składowane PL/SQL

Instrukcje sterujące. Programowanie Proceduralne 1

PHP w-3. Sterowanie w PHP

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

Materiały do zajęć III

Składnia funkcji i Rekurencja w języku Haskell

Wprowadzenie do programowania w języku C

Obsługa wyjątków. Język C++ WW12

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Kursory i wyjątki. (c) Instytut Informatyki Politechniki Poznańskiej 1

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Rozdział 4 KLASY, OBIEKTY, METODY

Wstęp do informatyki- wykład 7

Pętle. for, while, do... while, foreach. Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Instrukcje sterujące

KOTLIN. Język programowania dla Androida

Skrypty powłoki Skrypty Najcz ciej u ywane polecenia w skryptach:

Poprawność semantyczna

1 Kursory 1. 2 Wyjątki Wyjątki predefiniowane Wyjątki niezdefiniowane wcześniej Definiowanie własnych wyjątków...

while (test) instrukcja; int i=0; while (i<10) i++; dopóki test prawdziwy wykonuj instrukcję Wykonano: 35% / \ fałsz test prawda instrukcja

Wstęp do Informatyki dla bioinformatyków

Zapisywanie algorytmów w języku programowania

Klasy cd. Struktury Interfejsy Wyjątki

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Wykład 4: Klasy i Metody

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Pętle instrukcje powtórzeo

Słowem wstępu. Część rodziny języków XSL. Standard: W3C XSLT razem XPath 1.0 XSLT Trwają prace nad XSLT 3.0

Efekty uboczne błędów

LibreOffice Calc VBA

Paradygmaty programowania

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wstęp do programowania

Programowanie w języku Python. Grażyna Koba

Ćwiczenie 1. Wprowadzenie do programu Octave

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

for (inicjacja_warunkow_poczatkowych; wyrazenie_warunkowe; wyrazenie_zwiekszajace) { blok instrukcji; }

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Temat zajęć: Tworzenie skryptów powłoki systemu operacyjnego.

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

1 Przygotował: mgr inż. Maciej Lasota

Transkrypt:

Common LISP Instrukcje Sterujące Instytut Informatyki, Uniwersytet Wrocławski 27 października 2010

Reguły obliczania programu ( l i s t ( format t A 1) ( format t A 2) ( format t A 3 ) )

Reguły obliczania programu ( l i s t ( format t A 1) ( format t A 2) ( format t A 3 ) ) 1 2 3 ( NIL NIL NIL )

Reguły obliczania programu ( l i s t ( format t A 1) ( format t A 2) ( format t A 3 ) ) 1 2 3 ( NIL NIL NIL ) Instrukcje sterujące łamią standardowe reguły obliczania i pozwalają na sterowanie kolejnością wykonania instrukcji w programie.

Plan prezentacji 1 Grupowanie instrukcji Bloki: progn, block, tagbody Kontekst: let, let*, destructing-bind, flet, labels 2 Instrukcje warunkowe Pochodne if: when, unless, cond, case 3 Instrukcje iterujące loop do, dolist, dotimes, mapc, mapcar 4 Wyjątki throw/catch, error, unwind-protect

Grupowanie instrukcji

Konstrukcja progn Wywołuje po kolei wyrażenia podane jako argumenty i zwraca wartość ostatniego. ( progn ( format t A 1) ( format n i l A 2) ; Zwraca n a p i s j a k o s t r i n g ( format t A 3) ( format n i l A 4 ) ) 1 3 4

Konstrukcja block Działa jak progn o zdefiniowanej nazwie, ale dodatkowo pozwala na natychmiastowe zakończenie wykonywania ciągu instrukcji i zwrócenie zadanej wartości. ( b l o c k nazwabloku ( format t S t a r t. ) ( return from nazwabloku Wyskakujemy ) ( format t Koniec. ) ) S t a r t. WYSKAKUJEMY ( b l o c k n i l ( return 666)) 666

Automatycznie tworzone bloki Bloki o nazwie nil tworzą się automatycznie w ciałach niektórych instrukcji, na przykład z rodziny do, loop. ( dotimes ( n 10) ; wykonuje pę t l ę zadaną l i c z b ę r a z y ( format t A n ) ( i f (> n 3) ( return n ) ) ) 0 1 2 3 4 4

Automatycznie tworzone bloki c.d. Zdefiniowanie funkcji automatycznie tworzy blok o takiej samej nazwie jak funkcja. ( defun fun ( n ) (+ ( b l o c k b l o k ( i f (> n 0) ( return from fun e s c a p e ) ( return from b l o k 6 0 ) ) ) 606)) > ( fun 0) 666 > ( fun 1) ESCAPE Instrukcje return... pozwalają na wychodzenie z bloków o różnym zagłębieniu.

Konstrukcja tagbody Działa jak progn z tą różnicą, że pozwala na definiowanie etykiet i wykonywanie skoków. ( tagbody ( s e t f x 0) top ; e t y k i e t a ( s e t f x (+ x 1 ) ) ( format t A x ) ( i f (< x 10) ( go top ) ) ) ; skok 1 2 3 4 5 6 7 8 9 10 NIL tagbody jest automatycznie zdefiniowane w ciałach większości operacji iterujących.

Konstrukcja let Tworzy nowy kontekst w którym występują zadeklarowane i zainicjowane zmienne (w razie konieczności przykrywając już istniejące). ( l e t ( ( x 3) ; j a k o p i e r w s z y argument p o b i e r a ( y 4 ) ) ; l i s t ę par ( zmienna wartość) (+ x y ) ) 7 let został skonstruowany tak, aby zachowywać się jak wywołanie funkcji. Powyższy przykład jest równoważny następującemu lambda wyrażeniu: ( ( lambda ( x y ) (+ x y ) ) 3 4)

Konstrukcja let* Jedną z niedogodności let jest niemożność definiowania zależnych od siebie zmiennych, co jest natomiast wykonalne w konstrukcji let*. Poniższe wyrażenie zapisane jako let nie byłoby prawidłowe ( l e t ( ( x 2) ( y (+ x 3 ) ) (+ x y ) ) ponieważ byłoby równoważne następującemu wyrażeniu ( ( lambda ( x y ) (+ x y ) ) 2 (+ x 3 ) ) Natomiast jako let* jest równoważne ciągowi zagnieżdżonych instrukcji let: ( l e t ( ( x 2 ) ) ( l e t ( ( y (+ x 3 ) ) ) (+ x y ) ) )

Konstrukcja destructing-bind To makro uogólniające let pobiera drzewo zmiennych do zadeklarowania i odpowiadające drzewo wartości które mają im być przypisane. ( d e s t r u c t u r i n g b i n d (w ( x y ). z ) ( 1 (2 3) 4 5) ( l i s t w x y z ) ) (1 2 3 (4 5 ) ) ( d e s t r u c t u r i n g b i n d ( ( x ( y ) ) ( z ) ) ( ( ( 1 2) ( 3 ) ) ( ( 4 (5 6 ) ) ) ) ( l i s t x y z ) ) ( ( 1 2) 3 (4 (5 6 ) ) )

Konstrukcja flet Tworzy nowy kontekst w którym występuje zadeklarowana lokalna funkcja ( f l e t ( ( nazwa ( x y ) ; d e f i n i c j a f u n k c j i ( format t Args : A, A ; x y ) (+ x y ) ) ) ( format t Main b l o c k ; ) (+ ( nazwa 1 2) ( nazwa 3 4 ) ) ) Main b l o c k ; Args : 1, 2 ; Args : 3, 4 ; 10 Funkcja zadeklarowana flet nie może wywoływać samej siebie

Konstrukcja labels Nie posiada ograniczeń flet, pozwala więc na deklarowanie nazwanych lokalnie funkcji rekurencyjnych. ( l a b e l s ( ( nazwa ( x ) ( format t Arg : A ; x ) ( i f (= x 1) 1 (+ x ( nazwa ( x 1 ) ) ) ) ) ) ( format t Main b l o c k ; ) ( nazwa 4 ) ) Main b l o c k ; Arg : 4 ; Arg : 3 ; Arg : 2 ; Arg : 1 ; 10

Test Co powinno być w linijce ze znakiem zapytania? ( defun fun ( x y ) ( l e t ( ( y x ) ( x y ) ) ( tagbody bot ( b l o c k b l o k ( i f (= y 0) ( return from b l o k ) ) ( i f (= x 2) ( s e t f y 0 ) ) ( return from fun ( l i s t x y ) ) ) ( s e t f y x )? ( go bot ) ) ) ) > ( fun 0 2) (2 0) A. ( s e t f y 0) B. ( return from fun ( l i s t x y ) ) C. (format nil Litwo Ojczyzno moja... )

Test Co powinno być w linijce ze znakiem zapytania? ( defun fun ( x y ) ( l e t ( ( y x ) ( x y ) ) ( tagbody bot ( b l o c k b l o k ( i f (= y 0) ( return from b l o k ) ) ( i f (= x 2) ( s e t f y 0 ) ) ( return from fun ( l i s t x y ) ) ) ( s e t f y x )? ( go bot ) ) ) ) > ( fun 0 2) (2 0) A. ( s e t f y 0) B. ( return from fun ( l i s t x y ) ) C. (format nil Litwo Ojczyzno moja... )

Instrukcje warunkowe

Konstrukcja if Sprawdza warunek podany w pierwszym argumencie, po czym w zależności od tego czy jest prawdą czy nie, wykonuje odpowiednio swój drugi lub trzeci argument. Trzeci argument if jest opcjonalny, domyślnie wynosi nil. ( i f (> 3 2) ; warunek (+ 1 2) ; then (+ 1 1 ) ) ; e l s e

Konstrukcja if Sprawdza warunek podany w pierwszym argumencie, po czym w zależności od tego czy jest prawdą czy nie, wykonuje odpowiednio swój drugi lub trzeci argument. Trzeci argument if jest opcjonalny, domyślnie wynosi nil. ( i f (> 3 2) ; warunek (+ 1 2) ; then (+ 1 1 ) ) ; e l s e if pozwala na umieszczenie jedynie po jednej instrukcji w argumentach then/else. Jeśli chcemy napisać w tych miejscach coś większego trzeba explicite wykorzystać np. progn. ( i f (= x 0) ( progn ( format t then ) (+ x 2 ) ) ( format n i l e l s e )

Konstrukcje when, unless Problem ten rozwiązują częściowo instrukcje when i unless. Ich pierwszym argumentem jest warunek, który w przypadku when musi być prawdziwy, zaś dla unless fałszywy, aby program wykonywał kolejno wszystkie instrukcje podane jako dalsze argumenty. (when (= x 0) ( format t then ) (+ x 2 ) ) ( unless (= x 0) ( format t e l s e ) (+ x 1 ) )

Konstrukcja cond Odpowiada zagnieżdżonym instrukcjom if. Sprawdza po kolei podane warunki, aż któryś nie okaże się prawdą, jeśli tak wywołuje kolejne instrukcje przypisane do tego warunku, zwracając wartość ostatniej z nich. Jeśli żaden warunek nie będzie spełniony, zwracany jest nil ( cond ((< x 0) ( format t x ) 1) ((= x 0) ( format t 0 ) (+ 1 1 ) ) ( t ( format t +x ) 1 ) ) W przypadku gdy po warunku nie ma żadnych instrukcji, zwracana jest wartość samego warunku. > ( cond ( 6 6 6 ) ) 666

Konstrukcja case Pozwala na dopasowanie do serii wartości. W jednej klauzuli występuje porównanie (używające eql) do pojedynczej wartości lub listy wartości. W przypadku powodzenia wykonywane są instrukcje przypisane do tych wartości. Zawsze wykonywaną klauzulę można oznaczyć jako t lub otherwise. W przypadku braku dopasowania, lub gdy po dopasowaniu nie ma instrukcji, zwracany jest nil. ( case x (( 3 2 1) ujemna ) (0 z e r o ) ( o t h e r w i s e ( i f (> x 100) duza mala ) ) ) > ( case 666 ( 6 6 6 ) ) n i l

Test Jaki będzie efekt wywołania programów?

Test Jaki będzie efekt wywołania programów? (when ( n u l l ( n i l ) ) ( format t then ) ( return e s c a p e ) (+ 1 2 ) ) A. then ESCAPE B. then 3 C. e r r o r D. nil

Test Jaki będzie efekt wywołania programów? (when ( n u l l ( n i l ) ) ( format t then ) ( return e s c a p e ) (+ 1 2 ) ) A. then ESCAPE B. then 3 C. e r r o r D. nil

Test Jaki będzie efekt wywołania programów? (when ( n u l l ( n i l ) ) ( format t then ) ( return e s c a p e ) (+ 1 2 ) ) A. then ESCAPE B. then 3 C. e r r o r D. nil ( i f ( integerp (+ 1/3 8/6)) ( lambda ( x ) (+ x 1) (+ 1 1 ) ) ) (+ 2 2) A. 2 B. 3 C. 4 D. n i l

Test Jaki będzie efekt wywołania programów? (when ( n u l l ( n i l ) ) ( format t then ) ( return e s c a p e ) (+ 1 2 ) ) A. then ESCAPE B. then 3 C. e r r o r D. nil ( i f ( integerp (+ 1/3 8/6)) ( lambda ( x ) (+ x 1) (+ 1 1 ) ) ) (+ 2 2) A. 2 B. 3 C. 4 D. n i l

Instrukcje iterujące

Konstrukcja loop Najprostrza z możliwych pętli, kolejno wywołuje instrukcje przekazane jej jako argumenty, a gdy zrobi ostatnią przechodzi z powrotem do pierwszej. Istnieje możliwość opuszczenia pętli loop za pomocą instrukcji return, ponieważ automatycznie tworzy ona blok nil. ( s e t f x 0) ( loop ( format t o b r o t A % x ) ( s e t f x (+ x 1 ) ) ( i f (= x 4) ( return s t a r c z y ) ) ) o b r o t 0 o b r o t 1 o b r o t 2 o b r o t 3 STARCZY

Rozszerzenia loop Słowa kluczowe dla loop to: across, and, below, collecting, counting, finally, for, from, summing, then, to. Przykłady: ( loop f o r i from 1 to 10 c o l l e c t i n g i ) (1 2 3 4 5 6 7 8 9 10) ( loop f o r x from 1 to 10 summing ( x x ) ) 385 ( loop f o r x a c r o s s axxbcybcaxzcz c o u n t i n g ( f i n d x XYZ ) ) 6

Konstrukcja do Pierwszym argumentem jest lista specyfikacji dla zmiennych. Elementy tej listy są listami postaci (zmienna wartość początkowa aktualizacja), lub skróconymi (bez ostatniego, lub dwóch ostatnich elementów). Pętla tworzy daną zmienną, przypisuje jej początkową wartość, po czym po każdej iteracji wywołuje instrukcję odpowiedzialną za jej aktualizację. Kolejnym argumentem jest lista zawierające wyrażenie (którego prawdziwość jest sprawdzana po zastosowaniu aktualizacji), jeśli jest ono prawdziwe pętla zwaraca zadaną wartość. Wszystkie kolejne argumenty stanowią ciało pętli. ( do ( ( zmienna1 wartość początkowa1 a k t u a l i z a c j a 1 )... ( zmiannan wartość początkowan a k t u a l i z a c j a N ) ) ( warunek zwracana wartość) ( i n s t r u k c j a 1 )... ( i n s t r u k c j a N ) )

Pętla do z zależnymi zmiennymi iterowanymi Gdy pętla wykorzystuje więcej niż jedną zmienną iterowaną i zmienne te są od siebie zależne (podczas aktualizacji jednej z nich brana jest pod uwagę wartość innej), to podczas aktualizacji wszystkich zmiennych brane są pod uwagę wartości sprzed zmian. ( l e t ( ( x a ) ) ( do ( ( x 1 (+ x 1 ) ) ( y x x ) ) ((> x 5 ) ) ( format t ( A A) x y ) ) ) (1 A) (2 1) (3 2) (4 3) (5 4) NIL

Konstrukcja do* Pętla do* różni się od do tym, czym let* od let - czyli dynamiczną aktualizacją zmiennych. ( l e t ( ( x a ) ) ; n i e u żywana zmienna ( do ( ( x 1 (+ x 1 ) ) ( y x x ) ) ((> x 5 ) ) ( format t ( A A) x y ) ) ) (1 1) (2 2) (3 3) (4 4) (5 5) NIL

Esencja do Przykład wykorzystania drugiej iterowanej zmiennej jako akumulatora, z równoczesnym przerzuceniem obliczeń z ciała pętli do fazy aktualizacji zmiennej. ( defun s i l n i a ( n ) ( do ( ( j n ( j 1 ) ) ( f 1 ( j f ) ) ) ((= j 0) f ) ) )

Konstrukcja dolist Pętla przypisuje do zadanej zmiennej kolejne elementy listy. Trzeci element pierwszego argumentu zostanie zwrócony jako wartość pętli - domyślnie wynosi nil ( d o l i s t ( x ( a b c d ) done ) ( format t A x ) ) A B C D DONE

Konstrukcja dotimes Pętla o podobnej konstrukcji jak dolist. Wykonuje zadane n iteracji, przypisując zmiennej kolejne wartości od 0 do n 1. ( dotimes ( x 5 (+ x 1 ) ) ( format t A x ) ) 0 1 2 3 4 6

Konstrukcja mapc Pobiera funkcję oraz tyle list ile wynosi arność tej funkcji. W i-tym kroku wywołuje ją dla i-tych elementów list. Koniec pętli następuje, gdy dojdzie do końca którejś z podanych list. Zawsze zwraca swój drugi argument. (mapc # ( lambda ( x y z ) ( format t ( A A A) x y z ) ) ( k r g b more ) ( o a a a ) ( t k z l ) ) (KOT) (RAK) (GAZ) (BAL) (K R G B MORE)

Konstrukcja mapcar Działa podobnie jak mapc, ale w trakcie działania z rezultatów zwracanych przez zadaną funkcję buduje nową listę, którą zwraca jako rezultat. ( mapcar # ( lambda ( x y z ) ( format n i l A A A x y z ) ) ( k r g b more ) ( o a a a ) ( t k z l ) ) ( KOT RAK GAZ BAL )

Zagadka Jaki będzie efekt działania poniższej instrukcji? ( dotimes ( n 3) ( dotimes ( k 5 v a l ) ( format t A k ) ( i f (> k 2) ( return n ) ) ) ( format t % ) )

Zagadka Jaki będzie efekt działania poniższej instrukcji? ( dotimes ( n 3) ( dotimes ( k 5 v a l ) ( format t A k ) ( i f (> k 2) ( return n ) ) ) ( format t % ) ) 0 1 2 3 0 1 2 3 0 1 2 3 NIL

Wyjątki

Konstrukcje throw/catch Za pomocą instrukcji throw rzuca się wyjątek o podanej nazwie i wartości, natomiast catch łapie wyjątki jeśli się odpowiednio nazywają i zwraca ich wartość. Jeśli wyjątek trafi na catch nieodpowiedniego typu to wykonanie przenosi się poziom wyżej. Jeżeli w ogóle nie zostanie złapany powoduje błąd. ( defun sub ( ) ( throw uaaa 666)) ( defun s u p e r ( ) ( c a t c h uaaa ( sub ) ( format t To s i ę n i e pokaże ) ) ) > ( s u p e r ) 666

Konstrukcja error Umożliwia zasygnalizowanie błędu wykonania i wywołuje system obsługi błędów Lispa. ( e r r o r Marchewka ) Marchewka [ C o n d i t i o n o f type SIMPLE ERROR ] R e s t a r t s : 0 : [RETRY] Retry SLIME REPL e v a l u a t i o n r e q u e s t. 1 : [ABORT] Return to SLIME s top l e v e l. 2 : [ABORT BREAK] Reset t h i s t h r e a d 3 : [ABORT] K i l l t h i s t h r e a d B acktrace : 0 : (CCL : : CALL CHECK REGS ERROR Marchewka ) 1 : (CCL : : CHEAP EVAL (ERROR Marchewka ) ) more

Konstrukcja unwind-protect Pozwala na zadeklarowanie bloku kodu który będzie wykonywany niezależnie od powstałych w nim wyjątków. Instrukcja bierze dowolną liczbę argumentów i zwraca wartość pierwszego z nich. ( s e t f x 1) ( c a t c h uaaa ( unwind protect ( throw uaaa 666) ( s e t f x 2 ) ) ) 666 > x 2

Grupowanie instrukcji Instrukcje warunkowe Instrukcje iterujące Wyjątki Podsumowanie

Bibliografia Paul Graham, ANSI Common Lisp, Prentice Hall 1996 Peter Seibel, Practical Common Lisp, Apress 2005

Koniec