Common Lisp - funkcje i zmienne



Podobne dokumenty
Common LISP Instrukcje Sterujące

ZASADY PROGRAMOWANIA KOMPUTERÓW

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Programowanie obiektowe

Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Wprowadzenie do języka Common Lisp

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ć

Wykład 8: klasy cz. 4

Wstęp do programowania

Wykład 5: Klasy cz. 3

Systemy operacyjne. Laboratorium 9. Perl wyrażenia regularne. Jarosław Rudy Politechnika Wrocławska 28 lutego 2017

Podstawy programowania. Wykład PASCAL. Zmienne wskaźnikowe i dynamiczne. dr Artur Bartoszewski - Podstawy prograowania, sem.

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

Wykład 4: Klasy i Metody

Klasy abstrakcyjne i interfejsy

JavaScript funkcyjność

D D L S Q L. Co to jest DDL SQL i jakie s jego ą podstawowe polecenia?

Ada-95. Dariusz Wawrzyniak

Podstawy informatyki. Informatyka Stosowana Zajęcia nr 6. autor: Grzegorz Smyk

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

Programowanie w Ruby

Kurs WWW. Paweł Rajba.

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

OBIEKTY PHP. G. Panuś

Metaprogramowanie w Ruby

Programowanie i projektowanie obiektowe

Przeciążanie operatorów

Programowanie i projektowanie obiektowe

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Podstawy informatyki. Informatyka Stosowana Zajęcia nr 5. autor: Grzegorz Smyk

Wstęp do programowania

Język Python (2) Język Python (2) 1/36

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Szablony klas, zastosowanie szablonów w programach

WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI I INFORMATYKI INSTYTUT AUTOMATYKI I INFORMATYKI KIERUNEK AUTOMATYKA I ROBOTYKA STUDIA STACJONARNE I STOPNIA

API transakcyjne BitMarket.pl

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

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

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

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Procedury i funkcje. Programowanie komputerowe

Redis, skrypty w języku Lua

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Język programowania Scala / Grzegorz Balcerek. Wyd. 2. Poznań, cop Spis treści

Polimorfizm, metody wirtualne i klasy abstrakcyjne

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

PHP 5 język obiektowy

Podstawy JavaScript ćwiczenia

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

System operacyjny Linux

Zmienne i stałe w PHP

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Aplikacje w środowisku Java

PHP: bloki kodu, tablice, obiekty i formularze

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

Rozdział 4 KLASY, OBIEKTY, METODY

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Szablony funkcji i szablony klas

Elementy języka Scheme

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

Język Python. Język Python 1/35

Informatyka I. Dziedziczenie. Nadpisanie metod. Klasy abstrakcyjne. Wskaźnik this. Metody i pola statyczne. dr inż. Andrzej Czerepicki

BACKUP BAZ DANYCH FIREBIRD

Materiał. Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Funkcje Wskaźniki Referencje Tablice dynamiczne Typ string Przeładowania funkcji

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

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

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

Dokumentacja do API Javy.

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Przy dużej wielkości głębokości uzyskamy wrażenie nieskończoności: Dla głębokości zerowej uzyskamy tekst płaski:

Elementy rachunku lambda. dr hab. inż. Joanna Józefowska, prof. PP 1

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Webowy generator wykresów wykorzystujący program gnuplot

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

1 Atrybuty i metody klasowe

Programowanie obiektowe - 1.

Bloki anonimowe w PL/SQL

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Laboratorium 7 Blog: dodawanie i edycja wpisów

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

Lekcja 1. Składnia języka zmienne i podstawowe instrukcje PHP. Do wyświetlania tekstu służy instrukcja echo echo Hello world ;

KOTLIN. Język programowania dla Androida

Programowanie obiektowo zorientowane. Mirosław Głowacki Wykład w języku C++

Wyrażenie include(sciezka_do_pliku) pozwala na załadowanie (wnętrza) pliku do skryptu php. Plik ten może zawierać wszystko, co może się znaleźć w

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Deklaracja struktury w C++

Przydatne sztuczki - sql. Na przykładzie postgres a.

Lab 9 Podstawy Programowania

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

Administracja i programowanie pod Microsoft SQL Server 2000

Definicje klas i obiektów. Tomasz Borzyszkowski

dbamy o Twoją wygodę i bezpieczeństwo operacji dokonywanych za pośrednictwem Internetu bezpłatne i nie ulegają wyczerpaniu

Test przykładowy 2 PAI WSB Wrocław /06/2018

Transkrypt:

Instytut Informatyki Uniwersytetu Wrocławskiego 27 października 2010

Plan prezentacji 1 Funkcje 2

Plan prezentacji Funkcje 1 Funkcje Ogólna postać Sposoby podawania parametrów 2

Krótkie przypomnienie Funkcje Przykładowa definicja ( defun s q u a r e ( x ) ( x x ) ) Przykładowe wywołanie ( s q u a r e 17) ; ; 243

Krótkie przypomnienie Funkcje Przykładowa definicja ( defun s q u a r e ( x ) ( x x ) ) Przykładowe wywołanie ( s q u a r e 17) ; ; 243

Krótkie przypomnienie Funkcje Przykładowa definicja ( defun s q u a r e ( x ) ( x x ) ) Przykładowe wywołanie ( s q u a r e 17) ; ; 243

Plan prezentacji Funkcje 1 Funkcje Ogólna postać Sposoby podawania parametrów 2

Ogólna postać funkcji Funkcje Składnia ( defun nazwa ( parametry ) doc str? ciag wyrazen?)

Przykłady Funkcje ; ; Pusta l i s t a wyrazen, f u n k c j a zawsze zwraca NIL ( defun p a s s ( ) ) ; ; Troche b a r d z i e j r e a l i s t y c z n y p r z y k l a d ( defun verbose id ( x ) This i s a doc s t r i n g ( format t I got D %. x ) ( save the world ( ) ) x )

Przykłady Funkcje ; ; Pusta l i s t a wyrazen, f u n k c j a zawsze zwraca NIL ( defun p a s s ( ) ) ; ; Troche b a r d z i e j r e a l i s t y c z n y p r z y k l a d ( defun verbose id ( x ) This i s a doc s t r i n g ( format t I got D %. x ) ( save the world ( ) ) x )

Sposoby podawania parametrów Rodzaje argumentów W Common Lisp mamy następujące opcje: Wymagane parametry pozycyjne Opcjonalne parametry pozycyjne Parametry jako lista Nazwane parametry (ang. keyword arguments)

Sposoby podawania parametrów Rodzaje argumentów W Common Lisp mamy następujące opcje: Wymagane parametry pozycyjne Opcjonalne parametry pozycyjne Parametry jako lista Nazwane parametry (ang. keyword arguments)

Sposoby podawania parametrów Rodzaje argumentów W Common Lisp mamy następujące opcje: Wymagane parametry pozycyjne Opcjonalne parametry pozycyjne Parametry jako lista Nazwane parametry (ang. keyword arguments)

Sposoby podawania parametrów Rodzaje argumentów W Common Lisp mamy następujące opcje: Wymagane parametry pozycyjne Opcjonalne parametry pozycyjne Parametry jako lista Nazwane parametry (ang. keyword arguments)

Sposoby podawania parametrów Rodzaje argumentów W Common Lisp mamy następujące opcje: Wymagane parametry pozycyjne Opcjonalne parametry pozycyjne Parametry jako lista Nazwane parametry (ang. keyword arguments)

Obowiązkowe parametry pozycyjne Podajemy listę zmiennych, pod które zostaną podstawione (związane) argumenty Przykłady ( defun no args ( ) ) ( defun foo ( a b c ) ) Podanie nieodpowiednej liczby zmiennych kończy się zgłoszeniem wyjątku! A jeśli nie chcemy zawsze wszystkiego podawać?

Obowiązkowe parametry pozycyjne Podajemy listę zmiennych, pod które zostaną podstawione (związane) argumenty Przykłady ( defun no args ( ) ) ( defun foo ( a b c ) ) Podanie nieodpowiednej liczby zmiennych kończy się zgłoszeniem wyjątku! A jeśli nie chcemy zawsze wszystkiego podawać?

Obowiązkowe parametry pozycyjne Podajemy listę zmiennych, pod które zostaną podstawione (związane) argumenty Przykłady ( defun no args ( ) ) ( defun foo ( a b c ) ) Podanie nieodpowiednej liczby zmiennych kończy się zgłoszeniem wyjątku! A jeśli nie chcemy zawsze wszystkiego podawać?

Obowiązkowe parametry pozycyjne Podajemy listę zmiennych, pod które zostaną podstawione (związane) argumenty Przykłady ( defun no args ( ) ) ( defun foo ( a b c ) ) Podanie nieodpowiednej liczby zmiennych kończy się zgłoszeniem wyjątku! A jeśli nie chcemy zawsze wszystkiego podawać?

Opcjonalne parametry pozycyjne Przed pierwszym parametrem który ma być opcjonalny umieszczamy frazę &optional Możemy podać wartość domyślną, a także sprawdzić, czy dany argument został podany przy wywołaniu Przykład ( defun t e s t (& o p t i o n a l a ( b 1) ( c 6 c p ) ) ( l i s t a b ( l i s t c c p ) ) ) CL USER> ( t e s t ) ( NIL 1 (6 NIL ) ) CL USER> ( t e s t 1 2 3) (1 2 (3 T) )

Opcjonalne parametry pozycyjne Przed pierwszym parametrem który ma być opcjonalny umieszczamy frazę &optional Możemy podać wartość domyślną, a także sprawdzić, czy dany argument został podany przy wywołaniu Przykład ( defun t e s t (& o p t i o n a l a ( b 1) ( c 6 c p ) ) ( l i s t a b ( l i s t c c p ) ) ) CL USER> ( t e s t ) ( NIL 1 (6 NIL ) ) CL USER> ( t e s t 1 2 3) (1 2 (3 T) )

Parametry w postaci listy Funkcje Po ostatnim parametrze, który ma być nazwanym argumentem umieszczamy frazę &args i nazwę zmiennej z którą ma zostać związana lista pozostałych argumentów Przykład ( defun t e s t ( a b &r e s t params ) ( l i s t a b params ) ) CL USER> ( t e s t 1 2) (1 2 NIL ) CL USER> ( t e s t 1 6 7 8 9) (1 6 (7 8 9 ) )

Parametry w postaci listy Funkcje Po ostatnim parametrze, który ma być nazwanym argumentem umieszczamy frazę &args i nazwę zmiennej z którą ma zostać związana lista pozostałych argumentów Przykład ( defun t e s t ( a b &r e s t params ) ( l i s t a b params ) ) CL USER> ( t e s t 1 2) (1 2 NIL ) CL USER> ( t e s t 1 6 7 8 9) (1 6 (7 8 9 ) )

Nazwane parametry Funkcje Przed pierwszym parametrem który ma być (opcjonalnym) nazwanym parametrem umieszczamy frazę &key Możemy podać wartość domyślną, a także sprawdzić, czy dany argument został podany przy wywołaniu Przykład ( defun t e s t (&key a ( b 2) ( c 3 c p) d ) ( l i s t a b ( l i s t c c p) d ) ) CL USER> ( t e s t ) ( NIL 2 (3 NIL ) NIL ) CL USER> ( t e s t : a 1 : c 6) (1 2 (6 T) NIL )

Nazwane parametry Funkcje Przed pierwszym parametrem który ma być (opcjonalnym) nazwanym parametrem umieszczamy frazę &key Możemy podać wartość domyślną, a także sprawdzić, czy dany argument został podany przy wywołaniu Przykład ( defun t e s t (&key a ( b 2) ( c 3 c p) d ) ( l i s t a b ( l i s t c c p) d ) ) CL USER> ( t e s t ) ( NIL 2 (3 NIL ) NIL ) CL USER> ( t e s t : a 1 : c 6) (1 2 (6 T) NIL )

Używanie wielu wariantów jednocześnie Łączenie w ramach jednej definicji argumentów opcjonalnych i nazwanych bądź listowych i nazwanych prowadzi w niektórych przypadkach do dziwnych zachowań.

Używanie wielu wariantów jednocześnie cd. ( defun o p t i o n a l k e y (& o p t i o n a l a b &key c ) ( l i s t a b c ) ) ( defun rest key (& r e s t params &key a b c ) ( l i s t a b c r e s t ) ) Jak należy wywołać te funkcje, żeby doszło do czegoś dziwnego?

Plan prezentacji Funkcje 1 Funkcje Ogólna postać Sposoby podawania parametrów 2

jako dane Funkcje Chcielibyśmy traktować funkcje na równi z danymi, tj przekazywać je jako parametry, zwracać jako wyniki itp. Mamy jednak problem: umiemy wywołać konkretną funkcję, ale nie umiemy tego zrobić dla zmiennej (ani nawet utworzyć takiej zmiennej). [Podejście z Haskella/MLa nie działa] Na ratunek przybywają function, funcall i apply

jako dane Funkcje Chcielibyśmy traktować funkcje na równi z danymi, tj przekazywać je jako parametry, zwracać jako wyniki itp. Mamy jednak problem: umiemy wywołać konkretną funkcję, ale nie umiemy tego zrobić dla zmiennej (ani nawet utworzyć takiej zmiennej). [Podejście z Haskella/MLa nie działa] Na ratunek przybywają function, funcall i apply

jako dane Funkcje Chcielibyśmy traktować funkcje na równi z danymi, tj przekazywać je jako parametry, zwracać jako wyniki itp. Mamy jednak problem: umiemy wywołać konkretną funkcję, ale nie umiemy tego zrobić dla zmiennej (ani nawet utworzyć takiej zmiennej). [Podejście z Haskella/MLa nie działa] Na ratunek przybywają function, funcall i apply

Tworzenie obiektów funkcyjnych przez function function jest operatorem specjalnym, który zwraca obiekt funkcyjny na podstawie nazwy funkcji Zamiast (function foo) możemy użyć skrótu # foo CL USER> ( defun p a s s ( ) ) PASS CL USER> p a s s EVAL : v a r i a b l e PASS has no v a l u e CL USER> ( f u n c t i o n p a s s ) #<FUNCTION PASS NIL (DECLARE (SYSTEM : : IN DEFUN...

Tworzenie obiektów funkcyjnych przez function function jest operatorem specjalnym, który zwraca obiekt funkcyjny na podstawie nazwy funkcji Zamiast (function foo) możemy użyć skrótu # foo CL USER> ( defun p a s s ( ) ) PASS CL USER> p a s s EVAL : v a r i a b l e PASS has no v a l u e CL USER> ( f u n c t i o n p a s s ) #<FUNCTION PASS NIL (DECLARE (SYSTEM : : IN DEFUN...

Tworzenie obiektów funkcyjnych przez function function jest operatorem specjalnym, który zwraca obiekt funkcyjny na podstawie nazwy funkcji Zamiast (function foo) możemy użyć skrótu # foo CL USER> ( defun p a s s ( ) ) PASS CL USER> p a s s EVAL : v a r i a b l e PASS has no v a l u e CL USER> ( f u n c t i o n p a s s ) #<FUNCTION PASS NIL (DECLARE (SYSTEM : : IN DEFUN...

wyższego rzędu Funkcje Przekazanie funkcji jako argumentu ( defun succ ( x ) (+ x 1 ) ) ( mapcar # succ ( 1 2 3 4 5 ) )

funcall oraz apply Funkcje funcall i apply służą do wywoływania funkcji zadanych poprzez obiekt funkcyjny funcall używamy, gdy znamy arność funkcji apply przydaje się, gdy argumenty mamy w postaci listy Przykłady CL USER> ( f u n c a l l # + 1 2 3) 6 CL USER> ( apply # + ( 1 2 3 4 5 ) ) 15

funcall oraz apply Funkcje funcall i apply służą do wywoływania funkcji zadanych poprzez obiekt funkcyjny funcall używamy, gdy znamy arność funkcji apply przydaje się, gdy argumenty mamy w postaci listy Przykłady CL USER> ( f u n c a l l # + 1 2 3) 6 CL USER> ( apply # + ( 1 2 3 4 5 ) ) 15

Plan prezentacji Funkcje 1 Funkcje Ogólna postać Sposoby podawania parametrów 2

i operator lambda czasami potrzebujemy jednorazowej funkcji, którą np. podamy jako parametr do funkcjonału typu mapcar lambda wyrażenie może użyte wszędzie tam, gdzie można użyć zwykłej nazwanej funkcji Przykłady ( ( lambda ( x ) (+ x 1 ) ) 1) ( mapcar # ( lambda ( x ) ( x x ) ) ( 1 2 3 ) )

i operator lambda czasami potrzebujemy jednorazowej funkcji, którą np. podamy jako parametr do funkcjonału typu mapcar lambda wyrażenie może użyte wszędzie tam, gdzie można użyć zwykłej nazwanej funkcji Przykłady ( ( lambda ( x ) (+ x 1 ) ) 1) ( mapcar # ( lambda ( x ) ( x x ) ) ( 1 2 3 ) )

i operator lambda czasami potrzebujemy jednorazowej funkcji, którą np. podamy jako parametr do funkcjonału typu mapcar lambda wyrażenie może użyte wszędzie tam, gdzie można użyć zwykłej nazwanej funkcji Przykłady ( ( lambda ( x ) (+ x 1 ) ) 1) ( mapcar # ( lambda ( x ) ( x x ) ) ( 1 2 3 ) )

leksykalne i domknięcia dynamiczne Plan prezentacji 1 Funkcje 2 leksykalne i domknięcia dynamiczne

leksykalne i domknięcia dynamiczne Tworzenie zmiennych leksykalnych Mamy dwa sposoby tworzenia zmiennych leksykalnych (lokalnych): możemy użyć setf jako jednego z wyrażeń możemy też wprowadzić nowe zmienne (bądź zasłonić stare) poprzez let (bądź let*) Przykłady ( defun sum ( n ) ( s e t f count 0) ( dotimes ( x n ) ( i n c f count x ) ) count )

leksykalne i domknięcia dynamiczne Tworzenie zmiennych leksykalnych Mamy dwa sposoby tworzenia zmiennych leksykalnych (lokalnych): możemy użyć setf jako jednego z wyrażeń możemy też wprowadzić nowe zmienne (bądź zasłonić stare) poprzez let (bądź let*) Przykłady ( defun sum ( n ) ( s e t f count 0) ( dotimes ( x n ) ( i n c f count x ) ) count )

leksykalne i domknięcia dynamiczne Tworzenie zmiennych leksykalnych Mamy dwa sposoby tworzenia zmiennych leksykalnych (lokalnych): możemy użyć setf jako jednego z wyrażeń możemy też wprowadzić nowe zmienne (bądź zasłonić stare) poprzez let (bądź let*) Przykłady ( defun sum ( n ) ( s e t f count 0) ( dotimes ( x n ) ( i n c f count x ) ) count )

leksykalne i domknięcia dynamiczne Tworzenie zmiennych leksykalnych Mamy dwa sposoby tworzenia zmiennych leksykalnych (lokalnych): możemy użyć setf jako jednego z wyrażeń możemy też wprowadzić nowe zmienne (bądź zasłonić stare) poprzez let (bądź let*) Przykłady ( defun sum ( n ) ( s e t f count 0) ( dotimes ( x n ) ( i n c f count x ) ) count )

leksykalne i domknięcia dynamiczne Domknięcia A co jeśli zwrócimy funkcję, która odwołuje się do zmiennej lokalnej? Przykład ( s e t f i n c r ( l e t ( ( count 0 ) ) # ( lambda ( ) ( i n c f count ) ) ) )

leksykalne i domknięcia dynamiczne Domknięcia A co jeśli zwrócimy funkcję, która odwołuje się do zmiennej lokalnej? Przykład ( s e t f i n c r ( l e t ( ( count 0 ) ) # ( lambda ( ) ( i n c f count ) ) ) )

leksykalne i domknięcia dynamiczne Plan prezentacji 1 Funkcje 2 leksykalne i domknięcia dynamiczne

leksykalne i domknięcia dynamiczne dynamiczne w działaniu ( defvar x 10) ( defun foo ( ) ( format t X : d % x ) ) ( defun bar ( ) ( foo ) ( l e t ( ( x 20)) ( foo ) ) ( foo ) ) CL USER> ( bar ) X : 10 X : 20 X : 10

leksykalne i domknięcia dynamiczne dynamiczne Wszystkie zmienne na poziomie globalnym (najwyższym) są zmiennymi dynamicznymi Zmiana wartości zmiennej dynamicznej ma efekt na wszystkie wywołania funkcji w zasięgu tej zmiany - nawet jeśli tamte funkcji były zadeklarowane przed zmianą No to czemu nie mówimy na to zmienne globalne? Bo to coś lepszego!

leksykalne i domknięcia dynamiczne dynamiczne Wszystkie zmienne na poziomie globalnym (najwyższym) są zmiennymi dynamicznymi Zmiana wartości zmiennej dynamicznej ma efekt na wszystkie wywołania funkcji w zasięgu tej zmiany - nawet jeśli tamte funkcji były zadeklarowane przed zmianą No to czemu nie mówimy na to zmienne globalne? Bo to coś lepszego!

leksykalne i domknięcia dynamiczne dynamiczne Wszystkie zmienne na poziomie globalnym (najwyższym) są zmiennymi dynamicznymi Zmiana wartości zmiennej dynamicznej ma efekt na wszystkie wywołania funkcji w zasięgu tej zmiany - nawet jeśli tamte funkcji były zadeklarowane przed zmianą No to czemu nie mówimy na to zmienne globalne? Bo to coś lepszego!

leksykalne i domknięcia dynamiczne dynamiczne Wszystkie zmienne na poziomie globalnym (najwyższym) są zmiennymi dynamicznymi Zmiana wartości zmiennej dynamicznej ma efekt na wszystkie wywołania funkcji w zasięgu tej zmiany - nawet jeśli tamte funkcji były zadeklarowane przed zmianą No to czemu nie mówimy na to zmienne globalne? Bo to coś lepszego!

leksykalne i domknięcia dynamiczne dynamiczne globalne są wygodne, ale łatwo nabałaganić (i zapomnieć posprzątać) W Common Lisp możemy powiedzieć zmień tę wartość dla następnego wywołania (i podwywołań będących jego konsekwencją) i *tylko* dla niego

leksykalne i domknięcia dynamiczne dynamiczne globalne są wygodne, ale łatwo nabałaganić (i zapomnieć posprzątać) W Common Lisp możemy powiedzieć zmień tę wartość dla następnego wywołania (i podwywołań będących jego konsekwencją) i *tylko* dla niego

leksykalne i domknięcia dynamiczne dynamiczne w działaniu ( defvar y 10) ( defun foo ( ) ( format t Y : d % y ) ( i n c f y ) ( format t Y : d % y ) ) ( defun bar ( ) ( foo ) ( l e t ( ( y 20)) ( foo ) ) ( foo ) ) CL USER> ( bar ) Y : 10 Y : 11 Y : 20 Y : 21 Y : 11 Y : 12

leksykalne i domknięcia dynamiczne dynamiczne Jak utworzyć zmienną dynamiczną? defvar lub defparameter Jak zmienić wartość zmiennej dynamicznej? setf lub let Jak odróżnić w kodzie zmienne dynamiczne od lokalnych? Konwencja nazewnicza - zmienne dynamiczne otaczamy gwiazdkami

leksykalne i domknięcia dynamiczne dynamiczne Jak utworzyć zmienną dynamiczną? defvar lub defparameter Jak zmienić wartość zmiennej dynamicznej? setf lub let Jak odróżnić w kodzie zmienne dynamiczne od lokalnych? Konwencja nazewnicza - zmienne dynamiczne otaczamy gwiazdkami

leksykalne i domknięcia dynamiczne dynamiczne Jak utworzyć zmienną dynamiczną? defvar lub defparameter Jak zmienić wartość zmiennej dynamicznej? setf lub let Jak odróżnić w kodzie zmienne dynamiczne od lokalnych? Konwencja nazewnicza - zmienne dynamiczne otaczamy gwiazdkami

leksykalne i domknięcia dynamiczne Podsumowanie (the end)