Paradigmata programování 2 6. cvičení Radek Janoštík Univerzita Palackého v Olomouci 18.3.2019 Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 1 / 11
Vedlejší efekt Co se děje při: > (let ((x 2) (y 3)) (+ x y)) Co se děje při: > (setf (x 10)) Jaký je mezi tím rozdíl? Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 2 / 11
Lexikální uzávěry počet aplikací funkce (let ((count 0)) (defun fact (n) (setf count (+ count 1)) (if (= n 0) 1 (* n (fact (- n 1))))) (defun fact-cc () count) ) Jak přesně se vyhodnotí předchozí kód? Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 3 / 11
Lexikální uzávěry 1. úkol Napište funkce fact a last-fact funkce fact počítá faktoriál z daného čísla, jak jsme zvyklí funkce last-fact vrací v páru poslední argument a výsledek vypočítaný funkcí fact > (fact 3) 6 > (last-fact) (3. 6) > (fact 20) 2432902008176640000 > (last-fact) (20. 2432902008176640000) Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 4 / 11
Reprezentace datových struktur s mutátory Práce s abstraktními datovými strukturami potřebujeme konstruktor, selektory Pro mutovatelnost potřebujeme mutátory Můžeme struktury reprezentovat lexikálními uzávěry (defun my-cons (x y) (lambda (what &optional val) (case what (car x) (cdr y) (set-car (setf x val)) (set-cdr (setf y val))))) Popište, co se děje při vyhodnocení předchozího kódu Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 5 / 11
Reprezentace datových struktur s mutátory Selectory a mutátory: (defun my-car (c) (funcall c car)) (defun my-cdr (c) (funcall c cdr)) (defun my-set-car (c val) (funcall c set-car val)) (defun my-set-cdr (c val) (funcall c set-cdr val)) Jak tedy vytvoříte pár? Jak zjistíte jeho první prvek? Jak nastavíte jeho druhý prvek? Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 6 / 11
Reprezentace datových struktur s mutátory 2. úkol Implementujte pomocí uzávěrů datovou strukturu point reprezentující bod v rovině daný kartézskými souřadnicemi. Struktura bude mít konstruktor make-point, selektory x a y a mutátory set-x a set-y. Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 7 / 11
Reprezentace datových struktur s mutátory 3. úkol Napište funkci point-distance zjišt ující vzdálenost dvou bodů implementovaných jako struktury z předchozího příkladu. Čím se bude funkce lišit od analogických funkcí z minulého semestru? Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 8 / 11
Reprezentace datových struktur s mutátory 4. úkol Implementujte pomocí uzávěrů datovou strukturu circle reprezentující kruh v rovině daný středem a poloměrem. Poloměr kruhu je číslo, střed je bod reprezentovaný strukturou z minulých příkladů. Struktura bude mít konstruktor make-circle, selektory radius, center a mutátor set-radius (mutátor set-center neprogramujte). Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 9 / 11
Reprezentace datových struktur s mutátory 5. úkol Napište funkci circle-area, která zjistí plochu kruhu reprezentovaného datovou strukturou z předchozího příkladu. Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 10 / 11
Reprezentace datových struktur s mutátory 6. úkol Upravte definici struktur point a circle, aby bylo možné implementovat predikáty pointp, circlep Dané predikáty implementujte Radek Janoštík (Univerzita Palackého v Olomouci) Paradigmata programování 2 18.3.2019 11 / 11