Wprowadzenie do języka Common Lisp
|
|
- Kazimiera Cieślik
- 9 lat temu
- Przeglądów:
Transkrypt
1 Artykuł pobrano ze strony eioba.pl Wprowadzenie do języka Common Lisp Common Lisp jest najpopularniejszym dialektem Lispa, języka stworzonego w 1958 roku przez Johna McCarthy ego. Spis treści 1 Historia i opis języka 2 Co jest takiego niesamowitego w Common Lispie? 2.1 Skoro Lisp jest taki dobry, dlaczego nikt go nie używa? 3 Kompilator/interpreter oraz IDE 4 Yin i yang, czyli atom i lista - podstawowe typy danych 5 Składnia i podstawowe funkcje 5.1 cons 5.2 list 5.3 car i cdr 5.4 defun - definicja funkcji 5.5 eval 5.6 quote 5.7 print 5.8 if 5.9 cond 5.10 Funkcje matematyczne i relacyjne Równość 5.12 eq 5.13 eql 5.14 = 5.15 equal Cons Tablice Pathnames (ścieżki) Inne (struktury, hash tablice, instancje, equalp 5.17 append 5.18 First,second,third, cadar, nth i nthcdr 6 Zmienne 6.1 defparameter - definicja zmiennej dynamicznej 6.2 setf - ustawianie wartości zmiennej 7 Argumenty opcjonalne i słownikowe 7.1 Opcjonalne 7.2 Nieskończona ilość argumentów 7.3 Argumenty słownikowe 8 Dynamiczne i statyczne typowanie oraz Garbage Collector 9 Inne typy danych 9.1 String format 9.2 Tablica make-array array-rank aref 9.3 Hash tablica make-hash-table gethash 9.4 Instancje obiektów 9.5 Funkcje lambda function
2 9.5.3 #' 10 Namespace (środowisko) 10.1 apply 10.2 funcall 10.1 Generatory 11 Iteracja i mapowanie 11.1 loop 11.2 count-if 11.3 map 11.4 mapcar 11.5 mapc 12 Makra 12.1 when 12.1 progn kiedy 12.2 list* macroexpand Backquote string-case 13 O czym nie powiedziałem i o czym nie jest ten kurs 13.1 O czym nie powiedziałem, a co jest ważne 13.2 Czym nie jest ten kurs 14 Linki 14.1 Successfull Common Lisp 14.2 Practical Common Lisp 14.3 On Lisp Historia i opis języka Common Lisp jest najpopularniejszym dialektem Lispa, języka stworzonego w 1958 roku przez Johna McCarthy'ego. Pierwotnie język powstał jako narzędzie opisu rekursywnych funkcji wyrażeń symbolicznych ("Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I") i w zamyśle nie miał w ogóle zostać zaimplementowany na komputerze. Dokładniejszy opis wczesnej historii Lispa i szczegóły jego implementacji można przeczytać (po angielsku) na stronie Paula Grahama. Co jest takiego niesamowitego w Common Lispie? Makra. Możliwość tworzenia mini-języków najlepszych do danego problemu. Możliwość abstrakcji najczęściej wpisywanych rzeczy - nie wszystko da się załatwić klasą, metodą czy funkcją. Wydajność. Zarówno ta programisty (można znaleźć wiele ludzi relacji, którzy przepisali program napisany do Lispa - z 100k linii robiło sie 10k) jak i obliczeniową (generalnie Common Lisp ma najlepsze zarządzanie pamięcią ze wszystkich języków, a CMUCL czy Allegro Common Lisp bardzo często pokonuje program w C pod względem wydajności numerycznej). Spójność. Kod praktycznie wszędzie wygląda tak samo, wszyscy tak samo indentują kod (brak jakichkolwiek odpowiedników wojen oto, gdzie stawiać '{' itd) - bardzo dobra czytelność.
3 Skoro Lisp jest taki dobry, dlaczego nikt go nie używa? Używa go NASA przy obsłudze misji kosmicznych, AMD przy budowie procesorów, YahooStore, Boeing, został użyty przy produkcji animacji do Władcy Pierścieni,... Większą listę można znaleźć tu i tu. Gra MMORPG Vendetta jest napisana z użyciem języka Common Lisp razem z Erlang. Kompilator/interpreter oraz IDE Najpopularniejszym IDE do Lispa jest edytor Emacs w połączeniu ze SLIME. Kompilatorów i interpreterów jest dość dużo - jednak na sam początek polecam ściągnąć gotową dystrybucję LispBox z interpreterem CLISP dla twojego systemu. Uwaga: chociaż można odnieść wrażenie, że Lisp jest jedynie interpretowanym językiem, ze sprawdzaniem błędów jedynie w runtime, nie jest to prawdą - większość błędów zostanie wykryta już podczas kompilacji, przerywając ją - tak samo jak w C/C++, Delphi,... Kompilator to np. Allegro Common Lisp (płatny - zdecydowanie najlepszy ze wszystkich wymienionych), LispWorks, SBCL, CMUCL, Embedded Common Lisp, Corman Lisp, Gnu Common Lisp,... Po uruchomieniu środowiska zobaczysz linię komend REPL (skrót od "Read-Eval-Print-Loop" czyli "Wczytaj-Wykonaj-Wypisz-Powtórz"), w której możesz bezpośrednio wpisywać polecenia. W przykładach dodałem "=>" żeby zaznaczyć wartość zwracaną - nie jest on rzeczywiście wypisywany w SLIME. Kilka użytecznych skrótów klawiszowych: (C - ctrl; M (meta) - alt) M-p (albo C-strzałka w górę) - poprzednia komenda M-n (albo C-strzałka w dół) - następna komenda w historii C-M-p (albo C-M-strzałka w górę) - wraca do nawiasu otwierającego '(' C-M-n (albo C-M-strzałka w dół) - przeskakuje do nawiasu zamykającego ')' C-M-@ - podświetla całą forme (kursor musi byc na nawiasie otwierającym) C-M-k - wycina całą forme (do schowka) C-y (yank) - wkleja zawartość schowka. (standardowe ctrl-c ctrl-v ctrl-x można uzyskąć w tzw. CUA-mode, w emacsie 22 dostępnym domyślnie, w emacsie 21 trzeba zainstalować to samemu) Dobrym pomysłem jest przeczytanie wprowadzenia do Emacsa. Yin i yang, czyli atom i lista - podstawowe typy danych Kod i dane zbudowane są w Lispie z tej samej struktury danych: listy. Znak '(' oznacza początek listy, znak ')' koniec. Zawartością listy może być inna lista, albo atom. Wszystko jest albo listą, albo atomem.
4 (1 2 3) Lista złożona z trzech liczb. (1 (2 3) 4) Lista złożona z trzech elementów - liczby 1, dwu elementowej listy oraz liczby 4. Podstawowym budulcem listy jest struktura zwana cons. Cons składa się z dwóch pól: car i cdr (są to nazwy dwóch rejestrów komputera IBM 704, na którym została zaimplementowana pierwsza wersja Lispa). Jako struktura zapisana w języku C można to zapisać tak: struct Cons{ void *car; void *cdr; } Każda komórka listy to jeden cons - w polu car znajduje się dana, w polu cdr - adres następnej komórki cons. NULL (NIL) w polu cdr oznacza koniec listy. Składnia i podstawowe funkcje Wywołanie funkcji f z argumentem arg jest zapisywane jako: (f arg) Jest to odpowiednik zapisu f(arg) w innych językach programowania. Znając już zapis, możemy poznać podstawowe funkcje: cons (cons car cdr) Funkcja cons zwraca komórkę cons. CL-USER>; (cons 10 23) =>; (10. 23) Komórki cons, które nie są lista (cdr nie jest prawidłowym wskaźnikiem) są wypisywane z '.'. list
5 (list arg1 arg2 arg3...) Funkcja list przyjmuje dowolną liczbę argumentów, i zwraca listę z nimi. CL-USER>; (list ) =>; ( ) Każda lista jest zbudowana z połączonych komórek cons, więc zapis (list 1 2 3) jest równoznaczny (cons 1 (cons 2 (cons 3 nil))) Można to łatwo sprawdzić w REPL: CL-USER>; (cons 1 (cons 2 (cons 3 nil))) =>; (1 2 3) CL-USER>; (list 1 2 3) =>; (1 2 3) car i cdr i (car arg) (cdr arg) Funkcja car zwraca car komórki cons podanej w argumencie. CL-USER>; (car (cons 2 3)) =>; 2 Funkcja cdr przeciwnie - zwraca komórkę cdr. CL-USER>; (cdr (cons 2 3)) =>; 3 Pamiętając o tym, że listy są zbudowane z połączonych komórek cons, możemy użyc car i cdr żeby dostać pierwszy element listy oraz listę bez pierwszego elementu.
6 CL-USER>; (car (list 1 2 3)) =>; 1 CL-USER>; (cdr (list 1 2 3)) =>; (2 3) defun - definicja funkcji (defun nazwa-funcji argumenty kod) defun jest makrem służacym do definicji funkcji. CL-USER>; (defun dwie-listy (a b) (list (list a) (list b))) =>; DWIE-LISTY Zadeklarowaliśmy właśnie funkcję dwie-listy, zwracającą dwu-elementową listę z listami zawierającymi argumenty. Możemy ją wywołać w ten sam sposób jak funkcje wbudowane: CL-USER>; (dwie-listy 10 20) =>; ((10) (20)) eval (eval forma) Funkcja eval zwraca wynik wykonanej formy. CL-USER>; (list 'cons 50 60) =>; (CONS 50 60) CL-USER>; (eval (list 'cons 50 60)) =>; (50. 60) quote (quote argument) Funkcja quote zwraca nie ewaluowany argument. CL-USER>; (quote (list 1 2 3)) =>; (LIST 1 2 3)
7 (quote cos) można zapisać w krótszej formie jako 'cos ' jest to tzw. reader's macro (makro funkcji read) print (print co) Funkcja print wypisuje swój argument na standardowe wyjście. if (if test jeśli-tak jeśli-nie) Instrukcja warunkowa. Wykonuje test - jeśli zwróci prawdę, wykonuje kod jeśli-tak, w przeciwnym wypadku jeśli-nie. W języku Common Lisp prawdą jest wszystko oprócz symbolu nil (który jest jednocześnie pustą listą). Podstawowym symbolem reprezentującym prawdę jest symbol t CL-USER>; (if t "tak" "nie") =>; "tak" CL-USER>; (if nil "tak" "nie") =>; "nie" CL-USER>; (if '() "tak" "nie") =>; "nie" CL-USER>; (if (list) "tak" "nie") =>; "nie" cond (cond form1 form2...) Cond jest makrem wykorzystującym funkcję if - jest to odpowiednik if...else if...else w innych językach.
8 Car każdej formy jest ewaluowany - jeśli wynik jest prawdą, kod będący cdr jest wykonywany, w przeciwnym cond przechodzi do następnej formy. CL-USER>; (cond ((= 1 2) (print "1=2")) ((= 2 3) (print "2=3")) (t (print "t jest prawda"))) "t jest prawda" =>; "t jest prawda" CL-USER>; (cond ((= 1 2) (print "1=2")) ((<; 2 3) (print "2<3")) (t (print "t jest prawda"))) "2<3" => "2<3" Dlaczego dwa razy zostało wypisane to samo? Jedna wartość jest tekstem wypisanych przez print na standardowe wyjście - druga to wartość zwrócona, która jest z kolei wypisywana przez REPL. Funkcje matematyczne i relacyjne. Wyrażenia matematyczne są w Lispie zapisywane w Notacji Polskiej (prefixowej) - najpierw jest operator, później argumenty. Wyrażenie (+ 2 2) jest równoznaczne "2+2". CL-USER>; ( ) =>; 9 CL-USER>; (* 2 3 4) =>; 24 CL-USER>; (/ 2 3 4) =>; 1/6 CL-USER>; ( ) =>; -5 CL-USER>; (< 2 3 4) => T CL-USER>; (> 2 3 4) =>; NIL Część ludzi uważa tą notację za lepszą, część woli jednak tradycyjny zapis. Jeśli należysz do drugiej grupy, można ściągnąć makro readera do zapisu infixowego z CMU CL AI Repository. Po jego załadowaniu można pisać: CL-USER>; #I(2+2) =>; 4
9 Powstrzymaj się jednak z instalacją na początku nauki. Równość Równość w CL niejedno ma imię... eq (eq a b) Zwraca t, jeśli a i b to dokładnie ten sam obiekt. Na 99% jest to zaimplementowane jako porównanie adresu obiektu. eql (eql a b) Eql zwraca t jeśli: (eq a b) zwraca t a i b są podtypem typu number, są tego samego typu i mają tą samą wartość. a i b są znakami i są tym znakiem. (wielkość liter ma znaczenie) (= a b...) = Wszystkie argumenty muszą być podtypem typu number. Zwraca t, jeśli a = b (matematycznie) Przykład: CL-USER>; (eql 1.0 1) =>; NIL CL-USER>; (= 1.0 1) =>; T CL-USER>; (eql #C(1.0 0) 1.0) NIL CL-USER>; (= #C(1.0 0) 1.0) T #C(część_rzeczywista część_urojona) - zapis liczb zespolonych. (można także użyc funkcji complex) equal
10 (equal a b) Symbole, numery i znaki equal zwraca t jeśli argumenty są symbolami które eq, liczbami które eql, albo znakami które eql. Cons Dla cons, equal jest zdefiniowany rekursywnie - t jeśli dwa car equal i dwa cdr equal. Oznacza to, że można używać equal do porównywania list. Tablice Dwie tablice są równe tylko jeśli eq zwróci t, z jednym wyjątkiem - stringi i bit-wektory są porównywane po kolei dla wszystkich elementów używając eql. Jeśli jedna z tablic ma fill pointer (wskaźnik wypełnienia), limituje on maksymalną ilość porównanych elementów. Podczas porównywania stringów, wielkość liter ma znaczenie. Pathnames (ścieżki) Dwie ścieżki equal wtedy i tylko wtedy gdy wszystkie elementy (host, urządzenie, i tak dalej) są takie same. To, czy wielkość liter w ścieżce ma znaczenie zależy od implementacji. Jeśli obie ścieżki equal ich działanie powinno być identyczne. Inne (struktury, hash tablice, instancje,... Dwa obiekty equal tylko wtedy gdy eq zwróci t. equalp Typ Zachowanie number używa = character używa char-equal - wielkość znaków nie ma znaczenia cons zdefiniowane rekursywnie bit vector porównuje elementy string porównuje elementy pathname używa equal struktura struktury muszą miec ten sam typ i każdy musi być equalp inna tablica porównuje elementy hash table test i ilość elementów musi być ta sama; jeśli jest, porównuje elementy Inne obiekty używa eq append (append lista1 lista2 lista3...) Append łączy wszystkie listy w jedną i zwraca ją.
11 CL-USER>; (append (list 1 2 3) (list 4 5 6) (list 7 8 9)) =>; ( ) Wszystkie listy są kopiowane, oprócz ostatniej. Zatrzymaj się w tym miejscu i spróbuj, jako ćwiczenie, napisać funkcję zwracająca połączone listy bez ich pierwszego elementu. CL-USER>; (polacz-sublisty (list ) (list )) =>; ( ) CL-USER>; (polacz-sublisty (list "a" "b" "c") (list "d" "e" "f")) =>; ("b" "c" "e" "f") First,second,third, cadar, nth i nthcdr Zamiast pisać car można napisać first. W podobny sposób: (car(cdr obj)) = (second obj) (car(cdr(cdr obj)) = (third obj) Jeśli chcemy dostać n-ty car, najlepiej napisać: (nth n lista) Należy pamiętać, że pierwszy element ma indeks 0. Tak samo dla cdr i nthcdr. Zamiast pisać (car (car arg)) możemy napisać (caar arg). Literka 'd' oznacza że w tym miejscu jest cdr, a 'a' - car. (cadar arg) = (car (cdr (car arg))) Lepiej jednak unikać tych funkcji i zamiast nich używac first...tenth oraz nth/nthcdr. Wyjątkiem jest tutaj caar (i caaar) - jasno widać, że pobieramy wartość z zagnieżdżonej listy. Odpowiednikiem funkcji cdr jest rest, jednak nie robi to wielkiej różnicy. Zmienne Istnieją dwa oddzielne typy zmiennych - leksykalne i dynamiczne (nazywane także specjalnymi). Zmienna dynamiczna zawsze ma tylko jedną wartość - jej zmiana w jakimkolwiek miejscu w programie zmienia jej wartość globalną.
12 defparameter - definicja zmiennej dynamicznej (defparameter zmienna wartosc) definiuje zmienną specjalną. setf - ustawianie wartości zmiennej (setf zmienna wartosc) - ustawia wartość zmiennej. CL-USER>; (defparameter a 333) =>; A CL-USER>; (defun funkcja1 () (setf a 90)) =>; FUNKCJA1 CL-USER>; (defun funkcja (a) (print a) (funkcja1) (print a)) =>; FUNKCJA CL-USER>; (funkcja 20) =>; 90 CL-USER>; a =>; 333 CL-USER>; (funkcja1) 90 CL-USER>; a 90 Zmienna dynamiczna a zawsze istnieje ma tą samą wartość, w każdym miejscu programu. Funkcja z zadeklarowanym argumentem o takiej samej nazwie jak zmienna specjalna zapisuje obecną wartość zmiennej i przywraca ją na końcu, a następnie zmienia globalną wartość zmiennej a - w całym środowisku. Zmienna leksykalna istnieje tylko lokalnie - ta sama nazwa zmiennej może dać inną wartość w zależności od 'położenia'. Zmienne lokalne tworzą się automatycznie jako argumenty funkcji, albo przy użyciu let: CL-USER>; (let ((b 50) (d 10)) (print b) (print d)) =>; 10 CL-USER>; (let ((d 10)) (defun f1 () (setf d 90))) =>; F1
13 CL-USER>; (defun f2 (d) (print d) (f1) (print d)) =>; F2 CL-USER>; (f2 55) =>; 55 Jak widać, zmiana wartości zmiennej d nie zmieniła wartości d w innym środowisku. Zmienne leksykalne pozwalają uniknąć wielu błędów, dlatego najlepiej używać ich jak najczęściej. Aby 'ostrzec' innych programistów (i samego siebie) że dana zmienna jest dynamiczna, powinno się otaczać jej nazwę gwiazdkami: (defparameter *a* 23) Środowiska leksykalne istnieją tak długo, jak długo istnieje do nich dostęp (np. przez wywołanie funkcji) - można ich używać do przechowywania danych: CL-USER>; (let ((zmienna 0)) (defun zwieksz () (setf zmienna (+ zmienna 1)))) =>; ZWIEKSZ CL-USER>; (zwieksz) =>; 1 CL-USER>; (zwieksz) =>; 2 CL-USER>; (zwieksz) =>; 3 Zamiast pisać (setf zmienna (+ zmienna 1)) można napisać (incf zmienna). Argumenty opcjonalne i słownikowe Opcjonalne Argumenty opcjonalne oznacza się używając &optional.
14 Przykład: CL-USER>; (defun funkcja (&optional (x 666)) (print x)) FUNKCJA CL-USER>; (funkcja) 666 =>; 666 CL-USER>; (funkcja 20) 20 =>; 20 Nie ma ograniczenia (oprócz ograniczeń pamięci itd) na ilość zmiennych opcjonalnych. (defun funkcja (&;optional (arg1 "arg1") (arg2 40) (arg3 90) arg4)) Zdefiniuje 4 argumenty z wartościa domyślną - w przypadku arg4 jest to wartość nil. Nieskończona ilość argumentów Argumenty tego typu oznacza się poprzez &rest. Wszystkie podane argumenty zostaną zwinięte w jedną listę. CL-USER>; (defun fun-rest (&rest a) (print a)) FUN-REST CL-USER>; (fun-rest ) ( ) =>; ( ) Argumenty słownikowe Argumenty opcjonalne, podawane jako :index - można je wpisywać w dowolnej kolejności. Oznaczane poprzez &key. CL-USER>; (defun fun-key (&key (a "a") (b "b") c) (print a) (print b) (print c)) =>; FUN-KEY CL-USER>; (fun-key) "a"
15 "b" NIL =>; NIL CL-USER>; (fun-key :a "pawel" :c "gawel") "pawel" "b" "gawel" =>; "gawel" CL-USER>; (fun-key :a "lisp" :b "rzadzi") "lisp" "rzadzi" NIL =>; NIL Dynamiczne i statyczne typowanie oraz Garbage Collector Dynamiczne typowanie oznacza, że wartość ma typ, ale zmienna nie - można przypisać do niej obiekt dowolnego typu. Dynamiczne typowanie bardzo upraszcza i skraca programowanie. Statyczne typowanie jest jednak czasami przydatne, jak nie chcemy jakiegoś typu w danym miejscu. Można robić to 'ręcznie' - przy pomocy testów typu i ew. wyrzucenia błędu, ale lepiej powiedzieć jakiego typu oczekujemy: CL-USER>; (defun x (a) (declare (number a)) (print a)) =>; X CL-USER>; (x 23) 23 =>; 23 CL-USER>; (x "a") The value "a" is not of type NUMBER. [Condition of type TYPE-ERROR] Restarts: : [ABORT-REQUEST] Abort handling SLIME request. 1: [ABORT] Exit debugger, returning to top level. Backtrace: : (X "a") 1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (X "a") #<NULL-LEXENV>) Moim zdaniem domyślne dynamiczne typowanie i statyczne na żądanie jest najlepszym możliwym wyjściem.
16 Inne typy danych Wszystko, co nie jest listą, jest atomem - inne typy danych także. String Napis. Podtyp typu vector, który jest podtypem typu array. Zapisywany przy użyciu " ". format (format stream format-string argumenty) Potężny odpowiednik scanf z języka C. Faktem wartym zauważenia jest to, że wewnętrzny język format jest kompletny w sensie turinga. Opis wszystkich możliwości tu. ~A - wypisuje argument "ładnie". ~% - znak nowej linii. strumień t oznacza standardowe wyjście CL-USER>; (format t "~A~%" (list 1 2 3)) (1 2 3) =>; NIL Tablica make-array (make-array dimensions &;key element-type initial-element initial-contents adjustable fill-pointer displaced-to displaced-index-offset) Tworzy tablicę. CL-USER>; (make-array 20 :initial-element "lisp") =>; #("lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp" "lisp") Tworzy jedno-wymiarową tablicę z początkową wartością każdego elementu ustawioną na string "lisp". CL-USER>; (make-array '(5 5) :initial-element "comp.lang.lisp")
17 =>; #2A(("comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp") ("comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp") ("comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp") ("comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp") ("comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp" "comp.lang.lisp")) Tworzy dwu-wymiarową tablicę wypełnioną stringiem "comp.lang.lisp". array-rank Ilość wymiarów tablicy można sprawdzić przy pomocy funkcji array-rank. Wielkość tablicy typu adjustable może być dynamicznie zwiększana: CL-USER>; (defparameter *tablica* (make-array 5 :adjustable t)) =>; *TABLICA* CL-USER>; (array-total-size *tablica*) =>; 5 CL-USER>; (adjust-array *tablica* 20) =>; #( ) CL-USER>; (array-total-size *tablica*) =>; 20 Właściwości fill-pointer można użyć razem z właściwością adjustable do stworzenia dynamicznego stringa: CL-USER>; (defparameter *napis* (make-array 0 :element-type 'character :adjustable t :fill-pointer t)) =>; *NAPIS* CL-USER>; *napis* =>; "" CL-USER>; (format *napis* "ala ma kota") =>; NIL CL-USER>; *napis* =>; "ala ma kota" CL-USER>; (format *napis* "~%~A~%" (list 1 2 3)) =>; NIL CL-USER>; *napis* =>; "ala ma kota (1 2 3) " aref (aref tablica wymiary)
18 Zwraca element z tablicy. (aref tablica 23) = tablica[23] (w innych językach programowania). Hash tablica make-hash-table (make-hash-table &;key test size rehash-size rehash-threshold) Tworzy hash tablicę. Test oznacza rodzaj testu (eq,eql,equal albo equalp) jakim porównywane będą elementów. Niektóre implementacje, np. LispWorks, umożliwiają definicję całkowicie własnych testów. Większość implementacji dodaje argument słownikowy weak albo weakness - jeśli jest ustawiony na t, tworzy to "słabą" hash tablicę - klucze obecne w niej nie będą liczone przez Garbage Collector jako odnośniki do obiektu. Pozwala to uniknąć bardzo częstego (w językach z GC) wycieku pamięci. gethash (gethash klucz hash-tablica) Zwraca wartość elementu klucz z hash-tablica hash-tablica. Instancje obiektów Typem instancji jest jej klasa. Są one tworzone bezpośrednio przy użyciu funkcji allocate-instance albo pośrednio, przy użyciu make-instance. Opis CLOS (Common Lisp Object System) oraz MOP (Meta Object Protocol) mógłby zająć dwie grube książki, więc w ogóle pominę ich temat w tym krótkim wprowadzeniu. Funkcje Lisp był pierwszym językiem programowania, w którym funkcje były obiektami pierwszej klasy - można ja było zwrócić, przekazać w argumencie itd. Funkcja jest tworzona przy użyciu specjalnej formy - lambda: lambda (lambda (argumenty) kod) Zwraca anonimową funkcję.
19 CL-USER>; (lambda () (print "x")) =>; #<FUNCTION (LAMBDA ()) {AAD421D}> function Specjalna forma (function funkcja) Zwraca nazwaną funkcję w środowisku zmiennych (o tym za chwilę): CL-USER>; (function print) =>; #<FUNCTION PRINT> CL-USER>; #'print =>; #<FUNCTION PRINT> #' #' jest makrem readera, umożliwiającym krótszy zapis tego samego. Namespace (środowisko) Common Lisp, w przeciwieństwie do Scheme, posiada kilka środowisk - jedno dla funkcji, jedno dla zmiennych, jedno dla bloków (pominę w tym wprowadzeniu czym to jest). Symbol będący pierwszym elementem w obecnie ewaluowanej liście oznacza funkcję istniejącą w środowisku funkcji - dlatego aby wywołać funkcję istniejącą w środowisku zmiennych, należy użyć innej funkcji 'wywołującej': apply (apply funkcja argument1 argument2 lista-argumentow Wywołuje funkcję ze swoimi argumentami, z tym że ostatni argument musi być listą - jest on 'rozwijany' na normalne argumenty dla funkcji: CL-USER>; (defun funkcja (a b c d) (format t "a: ~A b: ~A c: ~A d: ~A~%" a b c d)) =>; FUNKCJA CL-USER>; (apply #'funkcja '(4)) a: 1 b: 2 c: 3 d: 4 =>; NIL CL-USER>; (apply #'funkcja '( )) a: 1 b: 2 c: 3 d: 4 =>; NIL CL-USER>; (apply #'funkcja ) attempt to use VALUES-LIST on a dotted list: 4 [Condition of type SIMPLE-TYPE-ERROR]
20 Restarts: : [ABORT-REQUEST] Abort handling SLIME request. 1: [ABORT] Exit debugger, returning to top level. Backtrace: : (APPLY #<FUNCTION FUNKCJA> 1) 1: (SB-INT:SIMPLE-EVAL-IN-LEXENV (APPLY (FUNCTION FUNKCJA) ) #<NULL-LEXENV>) funcall (funcall funkcja argument1 argument2 argument3 Wywołuje funkcję z swoimi argumentami. CL-USER>; (funcall #'funkcja ) a: 1 b: 2 c: 3 d: 4 =>; NIL Możemy w ten sposób wykonać anonimową funkcję: CL-USER>; (funcall (lambda (arg) (print arg)) "ala ma kota") "ala ma kota" =>; "ala ma kota" Generatory Używając lambdy, możemy bardzo łatwo zaimplementować prosty generator: CL-USER>; (defun generator-inc (start end) (lambda () (if (>; end start) (incf start) end))) GENERATOR-INC CL-USER>; (defparameter *gen* (generator-inc 2 6)) *GEN* CL-USER>; (funcall *gen*) 3 CL-USER>; (funcall *gen*) 4 CL-USER>; (funcall *gen*) 5 CL-USER>; (funcall *gen*) 6 CL-USER>; (funcall *gen*) 6 Każde wywołanie funkcji generator-inc tworzy nową closure - o ile nie zadeklarujemy zmiennej start i end jako
21 specjalne, możemy mieć na raz kilkanaście generatorów i wszystko będzie działać. Iteracja i mapowanie Common Lisp ma naprawdę ogromną liczbę funkcji/makr do zrealizowania pętli. Opiszę tylko kilka (moim zdaniem) najużyteczniejszych i najczęściej używanych. loop Loop jest kolejnym przykładem kompletnego w sensie Turinga mini-języka w cl (obok format). Jak nazwa wskazuje, służy do pętli. Jego składnia jest dość intuicyjna - przedstawię ją przez przykłady. CL-USER>; (defparameter *lista* '( )) =>; *LISTA* CL-USER>; (loop for obj in *lista* collecting obj) =>; ( ) CL-USER>; (loop for obj in *lista* summing obj) =>; 28 CL-USER>; (loop for i from to 10 and j from collect (list i j) into wynik finally (return wynik)) =>; ((0 0) (1 1) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7) (8 8) (9 9) (10 10)) CL-USER>; (loop for i from 5 downto when (oddp i) collect (1+ i)) =>; (6 4 2) Ten przykład policzy ilość liczb nieparzytnych - counting oznacza 'zwiększ licznik o 1 jeśli test zwróci prawdę'. Funkcja oddp zwraca prawdę jeśli liczba jest nieparzysta, w przeciwnym wypadku nil. CL-USER>; (loop for obj in *lista* counting (oddp obj)) 4 CL-USER>; (loop for i from to 5 do (print i)) =>; NIL
22 count-if Powyższy kod można również zapisać jako: CL-USER>; (count-if #'oddp *lista*) =>; 4 map (map result-value-type function sequence1 sequence2...) Funkcja map wywołuje funkcję podaną w drugim argumencie po kolei dla wszystkich elementów sekwencji podanych jako następne argumenty. Element ze sekwencji pierwszej to pierwszy argument, drugiej drugi, itd. Gdy funkcja powróci, map dodaje element zwrócony do wyniku o żądanym typie. Gdy jakakolwiek sekwencja się skończy, map zwróci dotychczas zebrane obiekty. CL-USER>; (map 'string (lambda (arg) (char-downcase arg)) "QWERTYUIOP") =>; "qwertyuiop" CL-USER>; (map 'vector #'+ '( ) '( )) =>; #( ) mapcar (mapcar funkcja sequence1 sequence2...) = (map 'list funkcja sequence1 sequence2...) mapc (mapc function sequence1 sequence2...) Mapc zwraca sequence1 - nie zbiera wyników. Użycie tej funkcji ma sens, gdy funkcja podana w pierwszym argumencie ma efekty poboczne - modyfikuje listę albo jakąś inną strukturę.
23 Makra Aby zdefiniować makro, należy użyć makra defmacro: (defmacro argumenty kod) Na pierwszy rzut oka nie widać wielkiej różnicy między deklaracją funkcji (defun). Różnice są jednak ogromne: Makra są wykonywane tylko raz, podczas kompilacji. Argumenty do makra nie są ewaluowane. Makra zwracają formę - czyli po prostu normalny kod źródłowy. Zdefiniujmy na początek proste makro - zaimplementujemy makro when. when (when test kod) Po prostu - kiedy. Kiedy test zwróci prawdę, wykonaj kod, w przeciwnym wypadku zwróć nil. Takie makro już istnieje w standardzie, nazwiemy więc nasze makro kiedy. Najpierw pomyślmy, jak napisać to ręcznie. Najlepiej użyć if i progn. progn progn wykonuje wszystkie formy zawarte w niej, i zwraca wynik ostatniej. CL-USER>; (progn ) 45 CL-USER>; (prog ) 23 CL-USER>; (prog ) 1 prog1 i prog2 zwracają, odpowiednio, pierwszą i drugą wartość. Progn jest nam potrzebne, gdyż if przyjmuje tylko jedną formę do wykonania. Kiedy (<; 2 4)
24 (2 jest mniejsze od 4) chcemy aby został wykonany kod (print "2") (print "jest") (print "mniejsze") (print "od") (print "4") CL-USER>; (if (< 2 4) (progn (print "2") (print "jest") (print "mniejsze") (print "od") (print "4"))) "2" "jest" "mniejsze" "od" "4" => "4" Działa. kiedy Nasz zapis używając kiedy ma wyglądać tak: (kiedy (<; 2 4) (print "2") (print "jest") (print "mniejsze") (print "od") (print "4")) Piszemy makro: CL-USER>; (defmacro kiedy (test &rest kod) (list 'if test (list* 'progn kod))) =>; KIEDY list* Tworzy listę z wszystkich argumentów i dołącza do ostatniego argumentu. (list* a b) = (cons a b)
25 macroexpand-1 Możemy sprawdzić wynik wykonania samego makra, używając funkcji macroexpand-1: CL-USER>; (macroexpand-1 '(kiedy (< 2 4) (print "tak"))) => (IF (< 2 4) (PROGN (PRINT "tak"))) => T Tak - forma wygląda tak, jak chcieliśmy. Druga wartość zwrócona przez macroexpand-1 (funkcja może zwracać dowolną ilość wartości, nie tylko jedną) oznacza że jakieś makro zostało wykonane. Funkcja macroexpand wykonuje całkowite rozwinięcie makra, korzystając z funkcji macroexpand-1, która rozwija tylko jeden raz. (jeśli korzystasz z SLIME, możesz uzyć C-c enter do wywołania macroexpand-1, i C-c M-m do wywołania macroexpand. Kursor musi być na otwierającym nawiasie formy z makrem). Sprawdźmy nasze makro na kodzie powyżej: CL-USER>; (kiedy (< 2 4) (print "2") (print "jest") (print "mniejsze") (print "od") (print "4")) "2" "jest" "mniejsze" "od" "4" => "4" Backquote Tworząc makra trzeba selektywnie ewaluowac formy - używanie ' (quote) i funkcji list szybko staje się męczące. ` - działa tak samo jak ', ale "," ma dla takiej formy specjalne znaczenie W środku formy ` : "," wyewaluuj formę po przecinku ",@" wyewaluuj formę po przecinku i przyłącz ją bezpośrednio do listy
26 Jako przykład, makro kiedy można zapisać w ten sposób: (defmacro kiedy (test &;rest kod) `(if,test (progn,@kod))) test jest ewaluowany (inaczej byłby w wynikowej formie zostałby symbol "test" a nie wartość argumentu!), kod jest ewaluowany i przyłączany do listy. Na koniec: makro string-case, do przeanalizowania. (string-case co (a1 kod) (a2 kod) (a3 kod) (otherwise kod)) Jeśli (equal co a_n) = t), wykonuje kod. W przeciwnym przypadku idzie dalej. Otherwise - w przeciwnym przypadku - jest wykonywane, gdy żaden test nie powiódł się. Gdy nie ma warunku otherwise, a żaden test się nie powiódł, zwraca nil. string-case (defmacro string-case (co &;rest forms) (let* ((otherwise nil) (wynik (mapcan (lambda (form) (cond ((eq (car form) 'otherwise) (setf otherwise (cdr form)) '()) (t `(((equal,co,(car form)),@(cdr form)))))) forms))) `(cond,@(append wynik (when otherwise `((t,@otherwise))))))) let* tym się różni od let, że binduje symbole po kolei, podczas gdy let wszystkie na raz. O czym nie powiedziałem i o czym nie jest ten kurs O czym nie powiedziałem, a co jest ważne Nie powiedziałem o CLOS, systemie wyjątków, MOP, strukturach, listach asocjacyjnych, strumieniach, modułach, asdf i asdf-install, pathnames i series. Jeśli zacząłeś/masz zamiar uczyć się CL, są to tematy którymi powinienieś się (ale dopiero po pewnym czasie) zainteresować.
27 Czym nie jest ten kurs Przeprowadzeniem kogoś kto nigdy nie widział języka na oczy do kodera CL. Do tego są książki - 20x dłuższe (adresy poniżej). Ten kurs ma na celu zapoznanie jedynie z podstawami języka i nie powinien być używany jako podstawa nauki. Linki Successfull Common Lisp Successfull Common Lisp - Bardzo dobra i rozległa książka Practical Common Lisp Practical Common Lisp - podejście praktyczne. Moim zdaniem dobra książka razem z poprzednią On Lisp On Lisp - książka o zaawansowanych technikach programowania funkcyjnego w Common Lispie Źródło: 4programmers.net. Treść udostępniona na zasadach licencji Creative Commons Attribution Autor: fr3 Artykuł pobrano ze strony eioba.pl
Common Lisp - funkcje i zmienne
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
Common LISP Instrukcje Sterujące
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
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Języki i techniki programowania Ćwiczenia 2
Języki i techniki programowania Ćwiczenia 2 Autor: Marcin Orchel Spis treści: Język C++... 5 Przekazywanie parametrów do funkcji... 5 Przekazywanie parametrów w Javie.... 5 Przekazywanie parametrów w c++...
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;
Klasy w C++ są bardzo ważnym narzędziem w rękach programisty. Klasy są fundamentem programowania obiektowego. Z pomocą klas będziesz mógł tworzyć lepszy kod, a co najważniejsze będzie on bardzo dobrze
Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)
Uwagi dotyczące notacji kodu! Wyrazy drukiem prostym -- słowami języka VBA. Wyrazy drukiem pochyłym -- inne fragmenty kodu. Wyrazy w [nawiasach kwadratowych] opcjonalne fragmenty kodu (mogą być, ale nie
znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.
Część XVI C++ Funkcje Jeśli nasz program rozrósł się już do kilkudziesięciu linijek, warto pomyśleć o jego podziale na mniejsze części. Poznajmy więc funkcje. Szybko się przekonamy, że funkcja to bardzo
Typy, klasy typów, składnie w funkcji
Typy, klasy typów, składnie w funkcji Typy w Haskell Każde wyrażenie w Haskell posiada zdefiniowany typ. Dzięki temu już na etapie kompilacji kodu następuje sprawdzenie poprawności kodu i zabezpiecza nas
PHP: bloki kodu, tablice, obiekty i formularze
1 PHP: bloki kodu, tablice, obiekty i formularze SYSTEMY SIECIOWE Michał Simiński 2 Bloki kodu Blok if-else Switch Pętle Funkcje Blok if-else 3 W PHP blok if i blok if-else wyglądają tak samo i funkcjonują
Elementy języka Scheme
Elementy języka Scheme Historia języka Lisp Historia języka Lisp Wyrażenia i ewaluacja wyrażeń Identyfikatory i wyrażenie let Wyrażenia lambda Definicje globalne Wyrażenia warunkowe Przypisanie Kontynuacje
Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].
ABAP/4 Instrukcja IF Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek]. [ELSEIF warunek. ] [ELSE. ] ENDIF. gdzie: warunek dowolne wyrażenie logiczne o wartości
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania Celem ćwiczenia jest zapoznanie studentów z najprostszą dynamiczną strukturą
Programowanie w języku Python. Grażyna Koba
Programowanie w języku Python Grażyna Koba Kilka definicji Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i
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?
Część XVIII C++ Funkcje 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? Umiemy już podzielić nasz
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Wstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
Redis, skrypty w języku Lua
edis, skrypty w języku Lua 1/15 Redis, skrypty w języku Lua Technologie Zarządzania Treścią dr inż. Robert Perliński rperlinski@icis.pcz.pl Politechnika Częstochowska Instytut Informatyki Teoretycznej
Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.
Zrozumienie funkcji danych statycznych jest podstawą programowania obiektowego. W niniejszym artykule opiszę zasadę tworzenia klas statycznych w C#. Oprócz tego dowiesz się czym są statyczne pola i metody
7. Pętle for. Przykłady
. Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i
Podstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1
Podstawy programowania, Poniedziałek 30.05.2016, 8-10 Projekt, część 1 1. Zadanie Projekt polega na stworzeniu logicznej gry komputerowej działającej w trybie tekstowym o nazwie Minefield. 2. Cele Celem
Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:
Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie
Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 5 Katarzyna Grzelak 26 marca 2018 9 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40 Pojęcia z poprzedniego wykładu Podział programu na funkcje podział na niezależne
Struktury, unie, formatowanie, wskaźniki
Struktury, unie, formatowanie, wskaźniki 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12, na rzecz swoich 143209 poddanych uchwalił dekret o 20 procentowej
Elementy języka Scheme
Elementy języka Scheme Historia języka Lisp Wyrażenia i ewaluacja wyrażeń Identyfikatory i wyrażenie let Wyrażenia lambda Definicje globalne Wyrażenia warunkowe Przypisanie Kontynuacje Historia języka
Wykład 3 Składnia języka C# (cz. 2)
Wizualne systemy programowania Wykład 3 Składnia języka C# (cz. 2) 1 dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD Wizualne systemy programowania Metody 2 Metody W C# nie jest
Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki
Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Konwersje liczba napis Ćwiczenia 1. Napisz aplikację, która na wejściu dostaje napis postaci W Roku Pańskim 1345, władca Henryk 12,
Programowanie obiektowe
Programowanie obiektowe Język programowania Ruby Marcin Młotkowski 12 kwietnia 2018 Plan wykładu 1 Wstęp 2 Typy numeryczne Łańcuchy znaków (klasa String) Przedziały Tablice i tablice asocjacyjne Nazwy
Paradygmaty programowania
Paradygmaty programowania Jacek Michałowski, Piotr Latanowicz 15 kwietnia 2014 Jacek Michałowski, Piotr Latanowicz () Paradygmaty programowania 15 kwietnia 2014 1 / 12 Zadanie 1 Zadanie 1 Rachunek predykatów
Definicje wyższego poziomu
Definicje wyższego poziomu Interpreter Scheme-a nie będzie narzekad w przypadku wystąpienia niezdefionowanej zmiennej w ciele wyrażenia lambda dopóki nie będzie zastosowana Przykład braku informacji o
Programowanie w języku C++ Grażyna Koba
Programowanie w języku C++ Grażyna Koba Kilka definicji: Program komputerowy to ciąg instrukcji języka programowania, realizujący dany algorytm. Język programowania to zbiór określonych instrukcji i zasad
Rozdział 4 KLASY, OBIEKTY, METODY
Rozdział 4 KLASY, OBIEKTY, METODY Java jest językiem w pełni zorientowanym obiektowo. Wszystkie elementy opisujące dane, za wyjątkiem zmiennych prostych są obiektami. Sam program też jest obiektem pewnej
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ć
MatLab część III 1 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ć komentarze poprzedzone znakiem % Skrypty
Programowanie w Turbo Pascal
Skróty: ALT + F9 Kompilacja CTRL + F9 Uruchomienie Struktura programu: Programowanie w Turbo Pascal Program nazwa; - nagłówek programu - blok deklaracji (tu znajduje się VAR lub CONST) - blok instrukcji
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Podstawy programowania. Podstawy C# Tablice
Podstawy programowania Podstawy C# Tablice Tablica to indeksowany zbiór elementów Tablica jest typem referencyjnym (deklaracja tworzy tylko referencję, sama tablica musi być utworzona oddzielnie, najprościej
PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec
PROE wykład 3 klasa string, przeciążanie funkcji, operatory dr inż. Jacek Naruniec Przypomnienie z ostatnich wykładów Konstruktory/destruktory i kolejność ich wywołania w złożonej klasie. Referencja Obiekty
Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).
Dekoratory są w miarę ezoteryczną cechą Pythona w przeciwieństwie do funkcji, klas czy iteratorów nie są powszechną cechą języków programowania. Niemniej, warto je omówić mimo wszystko, gdyż są niezwykle
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Podstawy programowania
Podstawy programowania I rok Automatyka i Robotyka Eka PWr Ćwiczenia Zestaw 4 Zakres materiału Analiza poprawności konstrukcji, wyliczanie wyrażeń z wskaźnikami i tablicami, ręczna symulacja, opracowywanie
Programowanie obiektowe
Programowanie obiektowe Podstawowe cechy i możliwości języka Scala mgr inż. Krzysztof Szwarc krzysztof@szwarc.net.pl Sosnowiec, 2017 1 / 32 mgr inż. Krzysztof Szwarc Programowanie obiektowe Informacje
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Wykład 4: Klasy i Metody
Wykład 4: Klasy i Metody Klasa Podstawa języka. Każde pojęcie które chcemy opisać w języku musi być zawarte w definicji klasy. Klasa definiuje nowy typ danych, których wartościami są obiekty: klasa to
Przykład 1: Funkcja jest obiektem, przypisanie funkcji o nazwie function() do zmiennej o nazwie funkcja1
Rachunek Prawdopodobieństwa i Statystyka lab 3. Kaja Gutowska (Kaja.Gutowska@cs.put.poznan.pl) 1. Funkcje: - Funkcje nie powinny korzystać ze zmiennych globalnych. - Funkcje powinny być możliwie krótkie.
Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 5 Katarzyna Grzelak 16 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27 Pojęcia z poprzednich wykładów Tablica to ciag obiektów tego samego typu, zajmujacy ciagły
Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)
Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.) przeznaczony do programowania zarówno pod ios jak i Mac OS X bazuje na logice Objective-C bez kompatybilności
4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Temat 1: Podstawowe pojęcia: program, kompilacja, kod
Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,
Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej
Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, rok
Zapis algorytmów: schematy blokowe i pseudokod 1
Zapis algorytmów: schematy blokowe i pseudokod 1 Przed przystąpieniem do napisania kodu programu należy ten program najpierw zaprojektować. Projekt tworzącego go algorytmu może być zapisany w formie schematu
W dowolnym momencie można zmienić typ wskaźnika.
c++ Wskaźniki mają jeszcze jedną przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Najpierw zdefiniujemy sobie wsk_uniwersalny mogący pokazywać
Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje
Podstawy informatyki Informatyka stosowana - studia niestacjonarne - Zajęcia nr 4 Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w
Bloki anonimowe w PL/SQL
Język PL/SQL PL/SQL to specjalny język proceduralny stosowany w bazach danych Oracle. Język ten stanowi rozszerzenie SQL o szereg instrukcji, znanych w proceduralnych językach programowania. Umożliwia
Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:
Program 6 Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje: Funkcja pobierz_osobe wczytuje dane osoby podanej jako argument. Funkcja wypisz_osobe
Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]
1. Typy. Java jest językiem programowania z silnym systemem kontroli typów. To oznacza, że każda zmienna, atrybut czy parametr ma zadeklarowany typ. Kompilator wylicza typy wszystkich wyrażeń w programie
Rekurencja (rekursja)
Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)
Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot
Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów mgr inż. Arkadiusz Chrobot 10 listopada 2010 1 Preprocesor Preprocesor jest programem uruchamianym przed właściwym procesem kompilacji
Programowanie obiektowe
Programowanie obiektowe Laboratorium 1. Wstęp do programowania w języku Java. Narzędzia 1. Aby móc tworzyć programy w języku Java, potrzebny jest zestaw narzędzi Java Development Kit, który można ściągnąć
Zmienne i struktury dynamiczne
Zmienne i struktury dynamiczne Zmienne dynamiczne są to zmienne, które tworzymy w trakcie działania programu za pomocą operatora new. Usuwa się je operatorem delete. Czas ich występowania w programie jest
Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.
Języki C i C++ to bardzo uniwersalne platformy programistyczne o ogromnych możliwościach. Wykorzystywane są do tworzenia systemów operacyjnych i oprogramowania użytkowego. Dzięki niskiemu poziomowi abstrakcji
Język C++ zajęcia nr 2
Język C++ zajęcia nr 2 Inicjalizacja Definiowanie obiektu może być połączone z nadaniem mu wartości początkowej za pomocą inicjalizatora, który umieszczany jest po deklaratorze obiektu. W języku C++ inicjalizator
Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.
Nazwa implementacji: Nauka języka C wyrażenia warunkowe if- Autor: Piotr Fiorek Opis implementacji: Poznanie struktury oraz zastosowania wyrażeń warunkowych if- w języku C. W programie realizującym jakiś
Tablice. Jones Stygar na tropie zmiennych
Tablice Jones Stygar na tropie zmiennych Czym jest tablica? Obecnie praktycznie wszystkie języki programowania obsługują tablice. W matematyce odpowiednikiem tablicy jednowymiarowej jest ciąg (lub wektor),
Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia
Podstawy informatyki Elektrotechnika I rok Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia Katedra Energoelektroniki i Automatyki Systemów Przetwarzania Energii AGH Kraków 2017 Tematyka
Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno
Instrukcja laboratoryjna 2 Podstawy programowania 2 Temat: Zmienne dynamiczne tablica wskaźników i stos dynamiczny Przygotował: mgr inż. Tomasz Michno 1 Wstęp teoretyczny 1.1 Tablice wskaźników Tablice
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi
IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi EGZAMIN PIERWSZY (25 CZERWCA 2013) JĘZYK C++ poprawiam ocenę pozytywną z egzaminu 0 (zakreśl poniżej x) 1. Wśród poniższych wskaż poprawną formę definicji
Tabela wewnętrzna - definicja
ABAP/4 Tabela wewnętrzna - definicja Temporalna tabela przechowywana w pamięci operacyjnej serwera aplikacji Tworzona, wypełniana i modyfikowana jest przez program podczas jego wykonywania i usuwana, gdy
Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.
Polimorfizm jest filarem programowania obiektowego, nie tylko jeżeli chodzi o język C++. Daje on programiście dużą elastyczność podczas pisania programu. Polimorfizm jest ściśle związany z metodami wirtualnymi.
Języki programowania zasady ich tworzenia
Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat
Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Program, to lista poleceń zapisana w jednym języku programowania zgodnie z obowiązującymi w nim zasadami. Celem programu jest przetwarzanie
Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści
Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop. 2017 Spis treści Przedmowa 11 1. Jak w programie 21 Czym jest program? 21 Uruchamianie interpretera języka Python 22 Pierwszy
Tablice (jedno i wielowymiarowe), łańcuchy znaków
Tablice (jedno i wielowymiarowe), łańcuchy znaków wer. 8 z drobnymi modyfikacjami! Wojciech Myszka Katedra Mechaniki i Inżynierii Materiałowej 2017-04-07 09:35:32 +0200 Zmienne Przypomnienie/podsumowanie
Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS
Program szkoleniowy Microsoft Excel VBA Poziom Podstawowy 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS 1. Nagrywanie makr Procedura nagrywania makra Nadanie odpowiedniej nazwy Przypisanie
Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu
Programowanie strukturalne Opis ogólny programu w Turbo Pascalu STRUKTURA PROGRAMU W TURBO PASCALU Program nazwa; } nagłówek programu uses nazwy modułów; } blok deklaracji modułów const } blok deklaracji
Deklaracja struktury w C++
Struktury to złożone typy danych pozwalające przechowywać różne informacje. Za pomocą struktur możliwe jest grupowanie wielu zmiennych o różnych typach w jeden obiekt. Strukturę można nazywać obiektem
C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów
Operatory są elementami języka C++. Istnieje zasada, że z elementami języka, takimi jak np. słowa kluczowe, nie można dokonywać żadnych zmian, przeciążeń, itp. PRZECIĄŻANIE OPERATORÓW Ale dla operatorów
Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.
Nazwa implementacji: Nauka języka Python wyrażenia warunkowe Autor: Piotr Fiorek Opis implementacji: Poznanie wyrażeń warunkowych if elif - else. Nasz kalkulator umie już liczyć, ale potrafi przeprowadzać
Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki
Typy wyliczeniowe Konwersje napis liczba Struktury, unie Scanf / printf Wskaźniki Typy wyliczeniowe Służą do łatwiejszej kontroli nad stałymi Ustawianie parametrów o ściśle określonym zbiorze wartości
Systemy operacyjne. Laboratorium 8. Perl find
Systemy operacyjne Laboratorium 8 Perl find Temat obejmuje przeszukiwanie drzew katalogowych z użyciem perla oraz podstawowe zdolności w używaniu referencji, tablic asocjacyjnych i mechanizmów typu stat.
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
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 obrębie skryptu. Wyrażenia include() i require() są niemal
Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk
Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, Materiał
PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec
PROE wykład 2 operacje na wskaźnikach dr inż. Jacek Naruniec Zmienne automatyczne i dynamiczne Zmienne automatyczne: dotyczą kontekstu, po jego opuszczeniu są usuwane, łatwiejsze w zarządzaniu od zmiennych
Metody numeryczne Laboratorium 2
Metody numeryczne Laboratorium 2 1. Tworzenie i uruchamianie skryptów Środowisko MATLAB/GNU Octave daje nam możliwość tworzenia skryptów czyli zapisywania grup poleceń czy funkcji w osobnym pliku i uruchamiania
TEST KOŃCOWY DLA KLASY III GIMNAZJUM- POGRAMOWANIE. Szkoła Podstawowa Nr 5. im. Księcia Mazowieckiego Siemowita IV w Gostyninie.
TEST KOŃCOWY DLA KLASY III GIMNAZJUM- POGRAMOWANIE 1. Po uruchomieni programu Greenfoot początkowa scena ma następujące składniki: a. obiekty scenerii i jeden obiekt ruchomy, b. obraz tła, jeden lub więcej
Ok. Rozbijmy to na czynniki pierwsze, pomijając fragmenty, które już znamy:
Kurs C++ częśd II Podstawowa obsługa konsoli + zmienne. Autor: Dawid Chróścielski. Wprowadzanie i wyprowadzanie danych z/do konsoli. Jak wyprowadzad dane dowiedzieliśmy się już wcześniej (metoda cout z
Wykresy i interfejsy użytkownika
Wrocław, 07.11.2017 Wstęp do informatyki i programowania: Wykresy i interfejsy użytkownika Wydział Matematyki Politechniki Wrocławskiej Andrzej Giniewicz Dzisiaj na zajęciach... Instrukcje sterujące Biblioteka
Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),
Tworzenie obiektów Dostęp do obiektów jest realizowany przez referencje. Obiekty w języku Java są tworzone poprzez użycie słowa kluczowego new. String lan = new String( Lancuch ); Obszary pamięci w których
Pierwsze kroki z easy Soft CoDeSys. 2009 Eaton Corporation. All rights reserved.
Pierwsze kroki z easy Soft CoDeSys Tworzenie prostego programu Rozpoczęcie pracy 2 Tworzenie prostego programu Wybór aparatu 3 Tworzenie prostego programu Wybór języka programowania Do wyboru jest sześć
1. Wprowadzenie do języka PHP
1. Wprowadzenie do języka PHP Język PHP jest generalnie w swojej składni podobny do języka C, chociaż występuje tu szereg różnic. 1.1. Zmienne W PHP nazwy zmiennych poprzedzamy znakiem dolara ($). Nie
10. Programowanie obiektowe w PHP5
Ogólnie definicja klasy wygląda jak w C++. Oczywiście elementy składowe klasy są zmiennymi PHP, stąd nieśmiertelne $. Warto zauważyć, że mogą one mieć wartość HHH mgr inż. Grzegorz Kraszewski TECHNOLOGIE
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1 Tablice wielowymiarowe C umożliwia definiowanie tablic wielowymiarowych najczęściej stosowane
Składowane procedury i funkcje
Składowane procedury i funkcje Procedury i funkcje są zestawem poleceń SQL, które są przechowywane na serwerze (tak jak dane w tablicach). Istnieją sytuacje, kiedy procedury i funkcje są szczególnie przydatne.
Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu.
Andrzej Wiśniewski Logika I Materiały do wykładu dla studentów kognitywistyki Wykład 11a. Składnia języka Klasycznego Rachunku Predykatów. Języki pierwszego rzędu. 1 Logika Klasyczna obejmuje dwie teorie:
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.
Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Abstrakcja funkcyjna Struktury Klasy hermetyzacja
Microsoft IT Academy kurs programowania
Microsoft IT Academy kurs programowania Podstawy języka C# Maciej Hawryluk Język C# Język zarządzany (managed language) Kompilacja do języka pośredniego (Intermediate Language) Kompilacja do kodu maszynowego