Programovací jazyk F#

Rozměr: px
Začít zobrazení ze stránky:

Download "Programovací jazyk F#"

Transkript

1 Programovací jazyk F# Speciální programovací jazyky Jiří Fišer MMXI

2 F# programovací jazyk primárně funcionální jazyk vytvořený Microsoft Resarch pro platformu.net původně port jazyka OCaml pro platformu.net, v současnosti (verze 2) i některé vlastní rysy staticky typovaný striktní multiparadigmatický jazyk podporovaná paradigmata (pořadí podle důležitosti) funkcionální paradigma (ve stylu jazyka ML) objektové paradigma (OOP model platformy.net) procedurální paradigma

3 Rodokmen jazyka F# F# (2003) Clojure (2007) OCaml (1996) Haskell (1990) Caml (1985) Miranda (1985) Common Lisp (1984) ML(1973) Scheme (1975) Lisp (1958)

4 Pro a proti: pro kvalitní vývojové prostředí (Visual Studio 2010), resp. rozšíření v Monodevelopu proti praktická použitelnost, včetně nabídek na pracovním trhu (ČR) dostatečná dokumentace a knihy (v angličině) komplikovanější syntaxe a sémantika (dáno především spojením původních funkcionálních prostředků a prostředků.net) ne zcela jednotný typový systém (ML vers. NET)

5 Struktura jazyka.net integrace OOP rozšíření (OCaml) funkcionální jádro Caml tao presentace se zaměřuje především na funkcionální jádro jazyka vrstvy se částečně prolínají, např. OOP třídy jsou potřeba pro poporu monád tj. čistě funkcionálního prostředku funkcionální nadstavba nad IEnumerable<T>

6 Základní pravidla syntaxe ve F# hraje odsazení syntaktickou roli tj. je nutné jej ; důsledně dodržovat tato pravidla: odsazovat lze jen mezerami jednotky na stejné synt. úrovni musí být zarovnány (zleva) podřízené synt. jednotky jsou odsazeny F# rozlišuje velká a malá písmena (navíc je zde dost silný úzus jejich používání!) poznámky: // řádkové (* dlouhé i víceřádkové *)

7 Funkce funkce jsou v F# běžnými hodnotami tj. lze je anonymně vytvářet, předávat do jiných funkcí či z funkcí vracet (stejně jako například čísla) F# podporuje všechny základní funkcionální mechanismy rekurze (s optimalizací koncové rekurze) lexikální vazbu a uzávěry currying funkce vyšších řádů (funkcionály) funkce a metody standardní knihovny.net jsou integrovány jen částečně (nefunguje currying,nejsou kompatibilní s běžnými funkcionály)

8 Definice funkce funkce jsou definovány pomocí konstrukce let: let mean x y = (x + y)/2.0 konstrukce váže v aktuálním kontextu funkci na symbol (s lexikální vazbou volných proměnných) překladač automaticky odvodí statický typ funkce, zde (float = System.Double): float -> float -> float zkratka za float -> (float -> float) funkce je automaticky curryovaná, tj. je interpretována jako funkce s jedním parametrem vracející funkci s n-1 parametry mean x y = (mean x) y

9 Volání funkce ve volání funkce nemusí být parametry uzávorkovány a neoddělují se čárkou mean závorky se používají jen pro změnu priorit, přičemž samo volání má vyšší prioritu než operátory závorky kolem složitějších parametrů mean (x + 2.0) (2.0 * y) závorky kolem celého volání funkce (mean 3.0 x)

10 Lokální vazby a vnořené funkce uvnitř funkcí lze provádět lokální vazby (= vazby v lokálním kontextu) vazby běžných hodnot let root a b c = let d = b*b 4.0 * a * c -b + sqrt d vazby funkcí (tzv. vnořené funkce, běžný ideom) let flip f = let g y x = f x y g

11 Operátory binární operátory jsou v F# de facto binární funkce (liší se jen jejich infixová aplikace) lze je volat jako funkce (prefixově) (+) 2 3 lze je definovat jako funkce (identif. musí být speciál. znaky) let (~~) x y = mean x y 5.0 ~~ 10.0 unární operátory se definují podobně, využívají se však pouze prefixově některé běžné operátory podporované přímo.net knihovnami mají speciální chování (+, *, <, &&, apod.): mohou být přetížené (různé chování pro různé typy) pokud je lze předefinovat tak jen objektově (obdoba C#)

12 Rekurzivní funkce rekurze se v F# běžně používá (je to funkcionální jazyk) rekurzovní funkce musí být explicitně definována pomocí konstrukce let rec koncová (tail) rekurze je optimalizována tj. O M (1) let fact x = let rec fact' x acc = if x = 1 then acc else fact' (x 1) (x * acc) fact' x 1 pomocná (vnořená) funkce fact' provádí výpočet s dodatečným parametrem pro akumulaci hodnoty, vnější funkce je jen jednoduchá (nerekurzivní) obálka

13 Elementární datové typy základní datové typy jsou stejné jako v C# pozor na rozdíly v názvech! int16 namísto short int64 namísto long float32 namísto float float namísto double, apod. přidány jsou nové typy (typické pro funkc. jazyky), např. bigint = System.Numeric.BigInteger literál: 2500I F# powerpack nabízí i BigRational

14 Implicitní přetypování F# nikdy neprovádí implicitní přetypování!! dokonce ani mezi číselnými objekty, např. int na float (double) float32 (float) na float (double) int16 (short) na int důsledek: u literálů je nutno důsledně uvádět datový typ (často pomocí suffixů) 2 int 2uy byte 2.0 float 2y byte 2.0F float32 2I bigint 2u uint 2UL uint64

15 Explicitní typování F# staticky odvozuje (infer) typy všech vázaných symbolů v programu (symbol odkazuje vždy jen jednu hodnotu během celé své existence v daném kontextu) v některých případech to však může být nejednoznačné či nemožné čísla (operace jsou přetíženy pro všechny číselné typy) let add x y = x + y //implicitně int -> int -> int let bigadd (x:bigint) (y:bigint) = x + y let hypot (x:float) (y:float) = sqrt (x*x + y*y) //povinné explicitní typy je třeba uvádět i u složitejších OOP objektů (především je-li využit objektový polymorfismus)

16 N-tice (tuple) nejednoduššími strukturovanými hodnotami jsou n- tice jsou neměnitelné (typické pro funkc. jazyk!) musí mít určen počet prvků (navíc nelze jednoduše transformovat n-tice s různými počty prvků) mohou být nehomogenní (= mouhou mít položky různých typů) zápis: (1, 2) ( Bill, m) ((true, 5), OK ) specifikace typu: int * int string * decimal (bool * int) * string

17 Použití n-tic representace strukturované hodnoty (náhrada záznamu, struktury, položky databáze) ( Jiří Fišer, 40, ) zabalení více návratových hodnot do jedné (podobně jako OOP vzor přepravka) let divmod x y = ( x / y, x % y) předání více parametrů jako jediné n-tice, což je bližší syntaxi a sémantice.net let max (a,b) = if a > b then a else b důsledně užíváno pro běžné.net metody a funkce nepodporuje currying nevhodné pro funkc. konstrukce

18 Seznam (list) standardní kolekcí jazyka F# je nemodifikovatelný seznam lispovského typu. Je izomorfní se seznamem ve Scheme a vnitřně representovaný binárním stromem. literály: [1; 2; 3], [ Eliška, Čertice ] [['a'], ['c', 'd', 'e']] pro čísla: [1..100], [ ] seznamy musí být homogenní (položky stejného typu) syntaktická zkratka za strom vytvořený operací :: (přidání do seznamu zleva tj. cons) 1 :: 2 :: 3 :: [ ] tj. 1 :: ( 2 :: ( 3 :: [ ])) namísto (destrukčních) operací car a cdr se využívá mechanismu tzv. unifikace vzorů

19 Označení typů kolekcí pokud je potřeba označit typ hodnoty (resp. je vypsán v interaktivním shellu fsi), pak lze n-tice a seznamy vyjádřit následujícími typy n-tice: typ 1 * typ 2 *... * typ n, kde typ i je typ i-té položky a n je počet položek příklady: int * int, (int * string) * float seznam: typ list kde typ je typ všech položek příklady: int list, (string * int) list

20 Unifikace vzorů (pattern matching) prostředek pro větvení programu na základě struktury a typu dat (vysokoúrovňová náhrada switch) let rec length s = match s with [] -> 0 //hodnota je prázdný seznam x :: xs -> 1 + length xs //struktura x::xs rozhodovat lze i na základě shody jednoduché hodnoty let simplenumber n = match n with 1 -> jedna 2 -> dve _ -> mnoho //univerzální vzor

21 Polymorfismus jazyk F# podporuje polymorfismus tj. lze vytvářet funkce které mohou zpracovávat hodnoty více než jednoho typu například funkce length zpracovává seznamy bez ohledu na typ jejich položek symbolické vyjádření typu funkce length je: 'a list -> int kde 'a je symbol libovolného typu (typová proměnná) skutečný typ je odvozen a kontrolován při každém využití polymorfní funkce (v místě volání funkce) a to již při překladu tj. polymorfismus je statický je tudíž obdobou generických typů v C# (generika a funkcionální polymorfismus jsou v F# částečně sjednoceny)

22 Složitější vzory vzory mohou být vnořené předpokládejme následující strukturu seznamu [( jf, 1); ( pk, 2); ( jf, 3); ( jf, 2); ( pk, 1)] kde řetězec je označení osoby a číslo známka let rec prumerprojf s = match s with ( jf, znamka) :: xs -> znamka + prumerprojf xs _ :: xs -> prumerprojf xs [] -> 0.0

23 Shrnutí vzorů vzor příklad s čím se shoduje vazba literál 1 jen se shodnou hodnotou ne symbol n s čímkoliv ano univerzální _ s čímkoliv ne složený x::xs se shodně strukturovanou hodnotou možná u podvzorů

24 Strážní podmínky unifikace vzorů není schopna nahradit konstrukce s podmínkami (např. if), neboť testovat lze pouze strukturální shody a rovnost s literály unif. vzorů je proto nutno rozšířit o strážní podmínky, které umožňují testovaní libovolné relace nad navázanými hodnotami let rec contains item s = //typ 'a -> 'a list -> bool match s with x::_ when x = item -> true _::xs -> contains item xs [] -> false ve vzoru se proměnná může vyskytovat nejvýše jednou (x,x) nutno použít (x,y) when x=y

25 Funkce s integrovanou unifikací funkce, jejichž tělo tvoří pouze unifikace jednoho z parametrů s různými vzory jsou v F# dosti běžné a tudíž pro bě existuje syntaktická zkratka (pozor: unifikovaný parametr musí být poslední) funkcionál map: ('a -> 'b) -> 'a list -> b' list let rec map f s = match s with [] -> [] x::xs -> (f x)::(map f xs) let rec map f = function [] -> [] x::xs -> (f x)::(map f xs) ve zkráceném zápise mizí poslední parametr (tj. ten, jehož hodnota je unifikována se vzory. Kam zmizel? Odpověď je spojena s anonymními funkcemi.

26 Lambda funkce anonymní (lambda) funkce: fun seznam-parametrů -> výraz příklady (v poznámce typ funkce): fun x -> x + 1I //bigint -> bigint fun a b -> (a, b) //'a -> 'b -> 'a * 'b fun (a,b) -> (b,a) //'a * 'b -> 'b * 'a fun x y -> if x > y then x else y //'a -> 'a -> 'a when 'a : comparison někdy lze místo λ-fce použít částečné volání (currying) (max 5), List.map (max 5) //(int list -> int list)

27 Kde je chybějící parametr? nyní se můžeme vrátit k chybějícímu parametru: let rec map f = function [] -> [] xs::xs -> (f x)::(map f xs) definuje formálně funkci s jedním parametrem (f), která je však definována pomocí anonymní funkce s dalším (v zápise skrytým) parametrem tj. v podobě explicitně curryované) zápis lze rozepsat pomocí běžné lambda funkce takto: let rec map f = fun x -> match x with [] -> [] x::xs -> (f x)::(map f xs)

28 Funkcionály F# podporuje všechny běžné funkcionály a to buď přímo (operátory, komprehenze), nebo pomocí knihovních funkcí běžné skládání funkcí (f g) f << g //('a -> 'b) -> ('c -> 'a) -> 'c -> 'b obrácené skládání funkcí (přehlednější zápis) f >> g //('a -> 'b) -> ('b -> 'c) -> 'a -> 'c reverzní volání (místo f x), běžný F# ideom x > f //'a -> ('a -> 'b) -> 'b lze řetězit více volání (tzv. pipeline česky datovod) s > filter (fun x -> x>0) > fold (fun x y -> x * y) > log10

29 Seznamové funkcionály map List.map //('a -> 'b) -> 'a list -> 'b list zip List.map2 //('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list fold left List.fold // ('a -> 'b -> 'a) -> 'a -> 'b list -> 'a fold right List.foldBack // ('a -> 'b -> 'b) -> 'a list -> 'b -> 'b filter List.filter //('a -> bool) -> 'a list -> 'a list

30 Seznamová komprehenze funkcionály map a filter se používají relativně málo, neboť je zahrnuju speciální zápis tzv. seznamová komprehenze [for var in list do if condition then yield item-expression] var = lokální proměnná (postupně jsou na ní vázány položky) list = původní seznam (při mapování se nemění!) condition = filtrovací podmínka (část s if je nepovinná) item-expression = mapovací výraz (= map. funkce aplikovaná na proměnou var) for x in seznam do if x > 0 yield 2*x sum (for x in seznam do yield List.length x)

31 Seznamová komprehenze (flat) F# seznamové komprehenze podporují i tzv. řetězení podseznam tj. operaci flat yield vloží svůj argument jako jediný prvek versus yield! vloží postupně jednotlivé prvky svého argumentu (musí to být seznam) [for x in [1.. 5] do yield [1..x]] vrací [[1]; [1; 2]; [1; 2; 3]; [1; 2; 3; 4]; [1; 2; 3; 4; 5]] [for x in [1.. 5] do yield! [1..x]] vrací [1; 1; 2; 1; 2; 3; 1; 2; 3; 4; 1; 2; 3; 4; 5]

32 Permutace různé typy seznamových komprehenzí lze ilustrovat například ve funkci vracející seznam všech permutací daného seznamu let ( ~) s a = [for item in s do if a <> item then yield item] let rec permutation = function [] -> [[]] s -> [for item in s do yield! [for sp in permutation (s ~ item) do yield item::sp]] typ funkce permutation: 'a list -> 'a list list when 'a : equality

33 Datový typ option klíčovou roli v F# hraje typ složený option, který umožňuje rozšířit běžné typy o nepřítomnou nebo nedefinovanou hodnotu (označována jako None) běžné hodnoty rozšířeného typu lze získat voláním konstruktoru Some na hodnotu Some(5) //typ int option Some( Frodo ) //typ string option hodnotu None lze získat prostřednictvím stejnojmeneného bezparametrického konstruktoru None // typ 'a option (polymorfní) základní přístup k objektům optional typů je možný pomocí unifikace vzorů

34 Unifikace vzorů s option obdoba operátoru?? jazyka C# (null-coalesing operator) let (?) x y = match x with Some(v) -> v None -> y x je potenciálně nedefinovaná hodnota a y náhradní hodnota (použitá v případě nedefinovanosti x) Some(5)? 0 //vrací 5 Some(0)? 0 //vrací 0 seznam > map (fun x -> x? 0) > sum

35 Algebraické typy typ option je konkrétním příkladem tzv. algebraického typu algebraické typy umožňují snadno vytvářet nové typy pomocí skládání, při zachování přístupu k dílčím položkám pomocí unifikace vzorů libovolný algebraický typ lze popsat jako množinu k 1 T 1 k 2 T 2 k n T n k i = konstruktor tj. jedinečný symbol (label) T i = je kartézský součin libovolných typů (včetně definovaného typu tj. typy mohou být rekurzivníi) nebo prázdná množina

36 Výčtový typ speciálním případem algebraických typů jsou tzv. výčtové typy u výčtových typů je i T i = tj. je to seznam symbolů (= bezparametrických konstruktorů) type color = Gule Azure Vert Sable Argent Or výčtové typy v F# nejsou vázány na číselnou representaci jako v C# (a nejsou přímo převoditelné)

37 Pojmenované struktury další specializovaným algebraickým typem jsou pojmenované struktury (v obecném zápise je n = 1) pojmenovaná struktura je n-tice hodnot libovolného typu opatřená symbolem-konstruktorem, jenž jednoznačně identifikuje hodnoty daného typu příklady: type complex = Complex of float * float type person = Person of string * int * int jednotlivé prvky struktury jsou určeny jen pozičně a jejich sémantika je zřejmá jen z použití! místo pojmenovaných struktur lze využít záznamy (record) = n-tice s pojmenovanými členy

38 Konstruktory a jejich funkce konstruktory mají dvojí funkci: 1. vytvářejí hodnoty (tj. skládají hodnoty) 2. slouží jako vzor pro unifikaci (tj. hodnoty rozkládají) funkce je dána syntaktickou pozicí konstruktoru: let conjugate = function Complex(re,im) -> Complex (re, - im) let makesmarter = function Person(name,age,iq) -> Person(name, age, iq+10) let name = function Person(name, _, _) -> name

39 Obecné algebraické typy obecné algebraické typy lze chápat jako sjednocení symbolických konstant a jedné či více množin struktur, přičemž hodnoty těchto jsou odlišeny návěštími type schoolholidays = Break of yeardate * yeardate StateHoliday of yeardate Easter let duration = function Break(from,to) -> interval to from StateHoliday _ Easter -> 1 //yeardate must be implemented (as algebraic type?)

40 Rekurentní typy algebraické typy mohou být rekurentní (tj. hodnota je soustavou navzájem vnořených hodnot stejného typu) následující typ representuje výrazy predikátové logiky (výrazy nikoliv hodnoty!) type logterm = True False Not of logterm And of logterm * logterm Or of logterm * logterm Impl of logterm * logterm //implikace Equiv of logterm * logterm //ekvivalence příklad hodnoty typu: Equiv(And(Not a, Not b), Not (Or(a,b)))

41 Zpracování rekurzivních typů není překvapivé, že rekurentní typy se nejlépe zpracovávají pomoci rekurze let rec eval = function True -> true False -> false Not(term) -> not (eval(term)) And(term1, term2) -> eval(term1) && eval(term2) Or(term1, term2) -> eval(term1) eval(term2) Impl(term1, term2) -> eval(term1) <= eval(term2) Equiv(term1, term2) -> eval(term1) = eval(term2) nad jednotlivými rekurentními typy lze definovat obdoby běžných seznamových funkcionálů (map, fold)

42 Polymorfní algebraické typy algebraické typy mohou být polymorfní tj. moho obsahovat položky předem neurčeného typu konkrétní typ položek se odvodí podle konkrétního použití (již při překladu) příkladem je např. algebraický typ pro binární stromy (který je navíc rekurentní) type 'a btree = Node of 'a * 'a btree * 'a btree Stub tj. strom je tvořen vnitřními uzly (mají vždy dva poduzly typu a' btree a uloženou hodnotou typu 'a) nebo pahýly resp.listy (koncovými uzly bez potomků)

43 Binární strom dva příklady funkcí nad binárnímy stromy let rec add item = function Stub -> Node(item, Stub, Stub) Node(num, left, right) when item <= num -> Node(num, add item left, right) Node(num, left, right) -> Node(num, left, add item right) let fromlist = List.fold (flip add) Stub let tolistdf tree = let rec tolistdf' tree acc = match tree with Node(n, l, r) -> acc > tolistdf' r > cons n > tolistdf' _ -> acc tolistdf' tree []

44 Aktivní vzory přímé použití vzorů je možné jen u vestavěných a algebraických typů nikoliv u běžných.net tříd F# proto podporuje možnost vytvoření (sekundárních) vzorů pro libovolný datový typ nejjednodušším případem je mapování podmnožin hodnot daného typu na symbolické konstanty let ( Workday Weekend ) (date : DateTime) = if date.dayofweek >= DayOfWeek.Monday && date.dayofweek <= DayOfWeek.Friday then Workday else Weekend aktivní vzory nelze samozřejměpoužít jako konstruktory

45 Aktivní vzory II o něco složitější jsou vzory mapující původní typ na obecné algebraické typy (tj. na vzory s parametrem) let ( YearDuration ) year = //zjednodušeno!! YearDuration( if year % 4 = 0 then 366 else 365) využití let testyear = function YearDuration(365) -> "normal year" YearDuration (366) -> "leap year" YearDuration(n) -> "abnormal year " + n.tostring() dále jsou podporovány i aktivní vzory s dodatečnými parametry a otevřené vzory (mohou existovat i nemapované hodnoty) za využití typu option

46 Kontrola měrných jednotek inovativním rysem F# je využití vyspělého typového systému pro kontrolu konzistence měrných jednotek při překladu (=staticky) měrné jednotky určují sémantiku hodnot a musí být využívány konzistentně (příkladem jsou fyzikální jednotky) (1) 1m 1kg //číselná shoda, sémantický rozdíl (2) 6N = 2kg * 3m^2/s^2 //komplexní vztahy mezi jednotkami měrné jednotky lze representovat pomocí klasického typového systému, komplexní vztahy (viz 2) by však vyžadovaly vytvoření nového typu pro každou složenou jednotku a explicitní předefinování operátorů (+,*,/)

47 Měrné jednotky a typový systém F# definuje měrné jednotky jako nadstavbu klasického typového systému tj. přkladač během překladu vytváří dodatečná metadata pro číselné typy (v rámci stat.odvození typu) [+] kompatibilita s s typovým systémem.net v generovaném kódu jsou použity jen klasické číselné typy float a int, lze jej tedy volat např. z C# [+-] není nutno rozšiřovat sémantiku typů speciální podpora zajišťují automatické odvození složených typů je k dispozici pouze pro měrné jednotky nikoliv obecné typy [-] za běhu nejsou údaje o měrných jednotkách k dispozici (ani např.pro účely tisku jednotky ve výstupu)

48 Měrné jednotky v praxi definice nového typu (de facto podtypu typu float nebo int) [<Measure>] type m [<Measure>] type s [<Measure>] type kg [<Measure>] type J = (kg * m^2)/(s^2) [<Measure>] type cal //není definován vztah k J označení číselných konstant 1.0<kg> (nikoliv 1<kg>), 2.3<s>, 5<m/s> povinné typování parametrů funkcí (typ návratové hodnoty může odvodit překladač) let cineticenergy mass : float<kg> velocity : float<m/s> = 0.5 * mass * velocity * velocity

49 Měrné jednotky II pro převod mezi jednotkami vyjadřujícími stejnou veličinu je nutno definovat pomocné funkce: všimněte si typování převodních koeficientů let tocal energy : float<j> = <cal>/1.0<J> * energy let tokelvin t : float<c> = t * 1.0<K> / 1.0<C> <K> někdy je nutné z důvodů kompatibility získat bezrozměrné číslo (pozor: většinou je to příznak rozměrové chyby!) let kgtofloat mass : float<kg> = mass / 1.0<kg>

50 Měrné jednotky III definice SI fyzikálních jednotek obsahuje sestava (assembly) F# PowerPack (FSharp.PowerPack.dll) jmenný prostor Microsoft.FSharp.Math.SI

51 Další typy kolekcí F# podporuje i další kolekce resp. kolekcím podobné objekty pole (array) modifikovatelná kolekce převzatá z.net (efektivní, ale mekomapatibilní s fukcionálním stylem) množina (set) efektivní implementace nemodifikovatelné množiny (unikátnost položek, není uspořádání) sekvence (seq) potenciálně neohraničená posloupnost položek, lenivé vyhodnocení = implementované pomocí.net rozhraní IEnumerable<T> klíčová je podpora sekvencí, které tvoří de facto lenivý protějšek běžných seznamů (lenivý subsystém ve striktním jazyce)

52 Sekvence zpracování sekvencí je v zásadě shodné se zpracováním seznamů lze používat stejné funkcionály (jen v jm. prostoru Seq) lze používat operaci head, tail (v podobě skip 1) (nikoliv však vzor ::) existují však i oblasti, kde se sekvence od seznamů zásadně liší vytváření (generování) sekvencí sekvence nelze definovat přidáváním prvků zprava nelze aplikovat operace vyžadující přítomnost všech prvků (např. reverse, length), konečné sekvence však lze převést na seznamy

53 Vytváření sekvencí konečné sekvence interval seq {0I I} sekvenční komprehenze seq {for x in [1..10] yield 6*x-1} nekonečné sekvence rekurze let allevens = let rec loop x = seq { yield x; yield! loop (x + 2) } loop 0 generující funkcionály

54 Funkcionály generující sekvenci initinfinite : (int -> 'T) -> seq<'t> funkce mapuje indexy na položky sekvence Seq.initInfinite (fun n -> 2*n) unfold : ('S -> ('T * 'S) option) -> 'S -> seq<'t> funkce vytváří další položky typu T na základě přeneseného stavu (typu S). Vrací option, aby mohla representovat konec sekvence (None). let fibs = (0I, 1I) > Seq.unfold (fun (a, b) -> Some(a, (b, a + b) ) )

55 Funkcionály nad sekvencemi generování sekvence prvočísel pomocí Eratosthenova síta (instruktivní, ale pomalé) pomocné funkce: let n = Seq.initInfinite (fun x -> x + 2) // N-{0,1} let head = Seq.head let tail = Seq.skip 1 let nondivisor d x = x % d <> 0 a můžeme definovat funkci let rec esito s = seq {yield head s; yield! esito (filter (nondivisor (head s)) (tail s))}

56 Převod na seznamy a vice versa n prvních prvků ze sekvence lze získat pomocí funkce Seq.take (vrací konečnou sekvenci) konečné sekvence lze převést na seznamy pomocí seq.tolist p = esito n //sekvence prvočísel Seq.toList(Seq.take 10 p) => [2; 3; 5; 7; 11; 13; 17; 19; 23; 29] opačný směr: Seq.ofList(list) podobné funkce existují i pro převod mezi ostatními sekvencemi (např. List.ofSeq), ne vždy však v párech např. existuje jen Set.toList, Set.ofSeq, apod.)

57 Proměnná data F# není čistě funkcionální jazyk a umožňuje používat modifikovatelné hodnoty (např. OOP objekty) či dokonce vytvářet celé programy v imperativním stylu F# se však snaží oba světa oddělit a v maximální míře zamezit negativním důsledkům použití imperativního kódu ve funkcionálním prostředí definice a inicializace proměnné let mutable i = 5 změna hodnoty (přiřazení): i <- 10 modifikovatelné hodnoty lze měnit jen v aktuálním kontextu (nikoliv např. v uzávěrech)

58 Měnitelné záznamy nejdůležitější měnitelnou kolekcí je záznam (= pojmenovatelná n-tice) v rámci záznamu lze specifikovat jaké položky jsou měnitelné (implicitně jsou samozřejmě konstantní) type product = { ID : int; mutable price : decimal; } let processproducts (items) = items > List.iteri (fun i item -> item.price <- (float i))

59 Reference měnitelné záznamy lze využít pro přenos měnitelné hodnoty vně funkce a její sdílení F# záznamy využívá v předdefinovaném typu ref (funguje jako měnitelná reference) type 'a ref = { mutable contents : 'a } let ref v = { contents = v } let (!) r = r.contents let (:=) r v = r.contents <- v využití let x = ref 100 x := 200!x

60 Měnitelné kolekce dalším typem měnitelných dat jsou pole a kolekce.net speciální podpora existuje jen pro pole let names = [ "Jitka"; "Jana"; "Jiřina" ] names.[2] <- "Judita" names.[1..2] //řezy (slices) tj. podpole podporovány jsou i vícerozměrná pole (kompaktní i jagged) pro přístup k ostatním kolekcím je možné využít standardní objektové rozhraní (např. ve stylu C#) open System.Collections.Generic let mylist = new List<string>() mylist.add("hello") mylist.[0]

61 Srovnání.NET a F# kolekcí.net Insert Remove Lookup F# counterpart List O(1) / O(n)* O(n) O(n) (linear) No built-in equivalent Insert Remove Lookup LinkedList O(1) O(1) O(n) No built-in equivalent Stack O(1) O(1) O(n) List O(1) n/a O(n) Queue O(1) O(1) O(n) No built-in equivalent HashSet O(1) / O(n)* O(1) O(1) Set O(log n) O(log n) O(log n) Dictionary O(1) / O(n)* O(1) O(1) Map O(log n) O(log n) O(log n) převzato z Wikibooks (F#)

62 Třídy z hlediska F# jsou třídy typy definované pomocí konstruktoru kontext objektu je de facto uzávěrem kontextu konstruktoru (viz syntaxe), v tomto kontextu jsou vázány datové členy (u běžných nelze již vazbu změnit) definice třídy (implicitní zápis, existuje ještě explicitní) type Account(number : int, holder : string) = class let mutable amount = 0m member x.number = number member x.holder = holder member x.amount = amount end member x.deposit(value) = amount <- amount + value member x.withdraw(value) = amount <- amount - value

63 Použití tříd použití tříd se v zásadě neliší v C#, objekty však lze využívat i v nativních F# konstrukcích let transfer amount (src : Account) (trgt : Account) = src.withdraw amount trgt.deposit amount //převzato z Wikibooks let ( Debet Kredit ) (a : Account) = if a.amount < 0m then Debet(a.Amount) else Kredit(a.Amount) let loan = function Debet _ -> 1000m Kredit m -> m/2m let a1 = new Account(666, "Sauron") a1.deposit( ) loan a1

64 Monády monády jsou funkcionálním prostředkem pro implementaci specializovaných toků řízení poznámka: běžným tokem se rozumí typický funkcionální neorientovaný strom vyhodnocení! v F# se monády označují jako computation expressions nebo workflows monády využívají běžné funkcionální mechanismy přímé použití však vede k velmi komplikovaným a nepřehledným kódům, proto moderní jazyky nabízejí syntaktické pozlátko: linearizované sekce programu mapované na monády pro pasivní využití monád postačuje jen pochopení relativně jednoduchého modelu tzv. obalených hodnot

65 Monády --- vnější pohled hlavní východisko hodnoty se mohou vyskytovat ve dvou základních stavech: přímé hodnoty mohou být zpracovány běžnými funkcemi (všechny dříve přímé hodnoty) obalené hodnoty lze bezpečně používat v prostředí monády tj. vždy plně podporují její sémantiku obalení je realizováno běžnými prostředky (je to např. seznam, hodnota variant nebo funkce), převod mezi stavy (tj. zabalení a rozbalení) však podléhá striktní sémantice, která monádu izoluje od zbytku jazyka

66 Monáda multihodnot jako příklad uveďme monádu, která umožňuje zpracování multihodnot multihodnota je množinou všech potenciálních hodnot (obdoba kvantových superpozic) na multihodnoty lze aplikovat běžné operace, které však mají mírně pozměněnnou sémantiku operace jsou volány postupně na všechny prvky multihodnoty (= množiny) jednotlivé výsledky tvoří množinu, kterou lze interpretovat jako výsledek (tj. novou multihodnotu) {1,0} + {2,3,4} = {2,3,4,5} implementace: Perl 6 a jeho junctions

67 Použití monády let result = variant { let! x = [2;3] let! y = [5;6;7;10] let! s = [-1;1] let z = 2*x + y return s*(z + 10) } uvnitř bloku variant lze vidět jak obalené hodnoty (seznamy převoditelné na množiny) tak výrazy s hodnotami přímými (viz např. výrazy 2*x + y, s*(z + 10) ) vazba pomocí let! hodnoty rozbaluje (tj. symbol následně odkazuje na přímé hodnoty) konstrukce return naopak hodnotu obaluje (jen tak může být předána vně monády (return nevrací hodnotu!)

68 Jak je to implementováno? překladač blok variant převede na výraz využívající funkcí bind (zajišťuje volání běžných funkcí na obalené hodnoty) a return (zabalení) funkce bind (převod na množinu, mapování funkce přes a následné sjednocení výsledků): bind boxedx f = boxedx Set.ofList > Set.map f > Set.fold Set.union Set.empty Set<'a> -> ('a -> Set<'b>) -> Set<'b> funkce return (z prvku vytváří jednoprvkovou množinu) return x = Set.add x Set.empty 'a -> Set<'a>

69 Rozpis multihodnotové monády sekvenční blok: variant { let! x [false, true] let! y [false, true] return x not y } je nahrazen výrazem (zjednodušeno): bind [true, false], (fun x -> bind [true, false], fun y -> (return x not y) ) výsledkem je množina s jedinou hodnotou (tj. logický výraz je tautologie)

70 Skutečná implementace skutečná implementace je složitější, neboť překladač potřebuje implementovat monádu jako objekt přesněji: monáda je singleton vytvořený továrnou (zde je to přímo třída) type VariantBuilder() = class member this.bind(x, f) = setflatmap f (Set.ofList x) member this.return(x) = toset x member this.delay(f) = f() //u jedn. monád vždy stejné end let variant = VariantBuilder() //vytvoření singletonu

71 Příklady monád serializační monády, které vynucují postupné provádění funkcí (tj. tvoří procedurální ostrov ve čistě fukcionálním jazyce) Haskell: tzv. IO monády F#: nepoužívají se (jazyk není čistě funkcionální) maybe monáda --- pracuje nativně s hodnotami typu option. Pokud v toku zpracování vznikne hodnota none, pak se automaticky vrací None (další operace se již neprovádí) async workflow --- jednotlivé operace jsou vykonávány asynchronně (a potenciálně i paralelně) jako úlohy nad množinou vláken. Monáda automaticky zajišťuje i synchronizaci.

Lokální definice (1) plocha-kruhu

Lokální definice (1) plocha-kruhu Lokální definice (1) syntaxe: (local (seznam definic) výraz) definice jsou dostupné pouze uvnitř příkazu local příklad: (local ( (define Pi 3.1415926) (define (plocha-kruhu r) (* Pi r r)) ) (plocha-kruhu

Více

PŘETĚŽOVÁNÍ OPERÁTORŮ

PŘETĚŽOVÁNÍ OPERÁTORŮ PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako

Více

Paradigmata programování 1

Paradigmata programování 1 Paradigmata programování 1 Explicitní aplikace a vyhodnocování Vilém Vychodil Katedra informatiky, PřF, UP Olomouc Přednáška 6 V. Vychodil (KI, UP Olomouc) Explicitní aplikace a vyhodnocování Přednáška

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Výrazy Operátory Výrazy Verze pro akademický rok 2012/2013 1 Operace, operátory Unární jeden operand, operátor se zapisuje ve většině případů před operand, v některých případech

Více

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4

2 Strukturované datové typy 2 2.1 Pole... 2 2.2 Záznam... 3 2.3 Množina... 4 Obsah Obsah 1 Jednoduché datové typy 1 2 Strukturované datové typy 2 2.1 Pole.................................. 2 2.2 Záznam................................ 3 2.3 Množina................................

Více

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu: Čtvrtek 8 prosince Pascal - opakování základů Struktura programu: 1 hlavička obsahuje název programu, použité programové jednotky (knihovny), definice konstant, deklarace proměnných, všechny použité procedury

Více

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod. Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání

Více

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz

Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Ukazka knihy z internetoveho knihkupectvi www.kosmas.cz Upozornění pro čtenáře a uživatele této knihy Všechna práva vyhrazena. Žádná část této tištěné či elektronické knihy nesmí být reprodukována a šířena

Více

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu

Více

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář Vazba (binding) Tabulka symbolů Miroslav Beneš Dušan Kolář vazba = spojení mezi entitou a vlastností okamžik vazby (binding time) při návrhu jazyka při implementaci jazyka během překladu/spojování/zavádění

Více

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou

Více

Zápis programu v jazyce C#

Zápis programu v jazyce C# Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač

Více

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ 1) PROGRAM, ZDROJOVÝ KÓD, PŘEKLAD PROGRAMU 3 2) HISTORIE TVORBY PROGRAMŮ 3 3) SYNTAXE A SÉMANTIKA 3 4) SPECIFIKACE

Více

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model Databázové systémy Tomáš Skopal - relační model * relační kalkuly Osnova přednášky relační kalkuly doménový n-ticový Relační kalkuly využití aparátu predikátové logiky 1. řádu pro dotazování rozšíření

Více

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39 Programování v C# Hodnotové datové typy, řídící struktury Petr Vaněček 1 / 39 Obsah přednášky Referenční datové typy datové položky metody přístupové metody accessory, indexery Rozhraní Pole 2 / 39 Třídy

Více

PB161 Programování v jazyce C++ Přednáška 9

PB161 Programování v jazyce C++ Přednáška 9 PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky

Více

Principy XQuery. funkcionální jazyk vše je výraz, jehož vyhodnocením vznikne určitá hodnota základní typy stejné jako v XML Schema:

Principy XQuery. funkcionální jazyk vše je výraz, jehož vyhodnocením vznikne určitá hodnota základní typy stejné jako v XML Schema: Realizováno za finanční podpory ESF a státního rozpočtu ČR v rámci v projektu Zkvalitnění a rozšíření možností studia na TUL pro studenty se SVP reg. č. CZ.1.07/2.2.00/29.0011 XQuery XQuery dotazovací

Více

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4 Uložení dat v počítači Data = užitečné, zpracovávané informace Kódování (formát) dat = způsob uložení v počítači (nutno vše převést na čísla ve dvojkové soustavě) Příklady kódování dat Text každému znaku

Více

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Maturitní otázky z předmětu PROGRAMOVÁNÍ Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti

Více

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1 24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE

Více

Přetěžování operátorů

Přetěžování operátorů Přetěžování operátorů Cíle lekce Cílem lekce je seznámit se s mechanizmem přetížení operátorů a s použitím tohoto mechanizmu při návrhu a implementaci programů. Po absolvování lekce budete: umět využívat

Více

typová konverze typová inference

typová konverze typová inference Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie

Více

Jazyk C++ I. Polymorfismus

Jazyk C++ I. Polymorfismus Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Operátory Co to vůbec jsou operátory? Na co je používáme? AR 2013/2014 Jazyk C++ I 2 Operátory Můžeme si upravit operátory pro vlastní objektové typy?

Více

Teoretické minimum z PJV

Teoretické minimum z PJV Teoretické minimum z PJV Pozn.: následující text popisuje vlastnosti jazyka Java zjednodušeně pouze pro potřeby výuky. Třída Zavádí se v programu deklarací třídy což je část programu od klíčových slov

Více

Paměť počítače. alg2 1

Paměť počítače. alg2 1 Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových

Více

Kolekce, cyklus foreach

Kolekce, cyklus foreach Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro

Více

Stromy, haldy, prioritní fronty

Stromy, haldy, prioritní fronty Stromy, haldy, prioritní fronty prof. Ing. Pavel Tvrdík CSc. Katedra počítačů FEL České vysoké učení technické DSA, ZS 2008/9, Přednáška 6 http://service.felk.cvut.cz/courses/x36dsa/ prof. Pavel Tvrdík

Více

Skripty základy VB, vestavěné objekty, příklady

Skripty základy VB, vestavěné objekty, příklady Skripty základy VB, vestavěné objekty, příklady Tento dokument popisuje základy VB, vestavěné objekty, jejich metody a vlastnosti. Na závěr jsou uvedeny typické příklady použití. Stav ke dni: 9.12.2006

Více

PRG036 Technologie XML

PRG036 Technologie XML PRG036 Technologie XML Přednáší: Irena Mlýnková (mlynkova@ksi.mff.cuni.cz) Martin Nečaský (necasky@ksi.mff.cuni.cz) LS 2010 Stránka přednášky: http://www.ksi.mff.cuni.cz/~mlynkova/prg036/ 1 Osnova předmětu

Více

Generické programování

Generické programování Generické programování Od C# verze 2.0 = vytváření kódu s obecným datovým typem Příklad generická metoda, zamění dva parametry: static void Swap(ref T p1, ref T p2) T temp; temp = p1; p1 = p2; p2 =

Více

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write(\nPrumerna teplota je {0}, tprumer); Pole (array) Motivace Častá úloha práce s větším množstvím dat stejného typu o Př.: průměrná teplota za týden a odchylka od průměru v jednotlivých dnech Console.Write("Zadej T pro.den: "); double t = Double.Parse(Console.ReadLine());

Více

Konstruktory překladačů

Konstruktory překladačů Konstruktory překladačů Miroslav Beneš Dušan Kolář Konstruktor Lex generátor lexikálních analyzátorů M. E. Lesk, 1975 - pro OS Unix flex - Vern Paxson, 1990 - GNU verze určeno pro generování výstupu v

Více

Odvozené a strukturované typy dat

Odvozené a strukturované typy dat Odvozené a strukturované typy dat Petr Šaloun katedra informatiky FEI VŠB-TU Ostrava 14. listopadu 2011 Petr Šaloun (katedra informatiky FEI VŠB-TU Ostrava) Odvozené a strukturované typy dat 14. listopadu

Více

Objektově orientované programování

Objektově orientované programování 10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh

Více

přetížení operátorů (o)

přetížení operátorů (o) přetížení operátorů (o) - pro vlastní typy je možné přetížit i operátory (tj. definovat vlastní) - pro definici slouží klíčové slovo operator následované typem/znakem operátoru - deklarace pomocí funkčního

Více

Knihovna DataBoxLib TXV 003 56.01 první vydání prosinec 2010 změny vyhrazeny

Knihovna DataBoxLib TXV 003 56.01 první vydání prosinec 2010 změny vyhrazeny Knihovna DataBoxLib TXV 003 56.01 první vydání prosinec 2010 změny vyhrazeny 1 TXV 003 56.01 Historie změn Datum Vydání Popis změn Prosinec 2010 1 První vydání, popis odpovídá DataBoxLib_v14 OBSAH 1 Úvod...3

Více

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu } 5. Operátor čárka, - slouží k jistému určení pořadí vykonání dvou příkazů - oddělím-li čárkou dva příkazy, je jisté, že ten první bude vykonán dříve než příkaz druhý. Např.: i = 5; j = 8; - po překladu

Více

Výčtový typ strana 67

Výčtový typ strana 67 Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce

Více

Datové typy a struktury

Datové typy a struktury atové typy a struktury Jednoduché datové typy oolean = logická hodnota (true / false) K uložení stačí 1 bit často celé slovo (1 byte) haracter = znak Pro 8-bitový SII kód stačí 1 byte (256 možností) Pro

Více

1. Dědičnost a polymorfismus

1. Dědičnost a polymorfismus 1. Dědičnost a polymorfismus Cíl látky Cílem této kapitoly je představit klíčové pojmy dědičnosti a polymorfismu. Předtím však je nutné se seznámit se základními pojmy zobecnění neboli generalizace. Komentář

Více

Algoritmizace a programování

Algoritmizace a programování Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,

Více

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e); TŘÍDY POKRAČOVÁNÍ Události pokračování public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e); class Bod private int x; private int y; public event ZmenaSouradnicEventHandler ZmenaSouradnic;

Více

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31 Programování v C# Další jazykové konstrukce Petr Vaněček 1 / 31 Obsah přednášky Přetěžování metody operátory Generika Kolekce třídy rozhraní 2 / 31 Překrytí vs. přetížení Rozdíl ve způsobu deklarace metody/operátoru

Více

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní Základy jazyka C# doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Architektura.NET Historie Vlastnosti

Více

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Využití OOP v praxi -- Knihovna PHP -- Interval.cz Page 1 of 6 Knihovna PHP Využití OOP v praxi Po dlouhé teorii přichází na řadu praxe. V následujícím textu si vysvětlíme možnosti přístupu k databázi pomocí různých vzorů objektově orientovaného programování

Více

Ukládání a vyhledávání XML dat

Ukládání a vyhledávání XML dat XML teorie a praxe značkovacích jazyků (4IZ238) Jirka Kosek Poslední modifikace: $Date: 2014/12/04 19:41:24 $ Obsah Ukládání XML dokumentů... 3 Ukládání XML do souborů... 4 Nativní XML databáze... 5 Ukládání

Více

7. Datové typy v Javě

7. Datové typy v Javě 7. Datové typy v Javě Primitivní vs. objektové typy Kategorie primitivních typů: integrální, boolean, čísla s pohyblivou řádovou čárkou Pole: deklarace, vytvoření, naplnění, přístup k prvkům, rozsah indexů

Více

2 Datové typy v jazyce C

2 Datové typy v jazyce C 1 Procedurální programování a strukturované programování Charakteristické pro procedurální programování je organizace programu, který řeší daný problém, do bloků (procedur, funkcí, subrutin). Původně jednolitý,

Více

1. Téma 03 - Rozhodování

1. Téma 03 - Rozhodování 1. Téma 03 - Rozhodování Cíl látky Seznámit se a prakticky si vyzkoušet zápis rozhodování v jazyce Java 1.1. Úvod Jednou z nejčastěji používanou konstrukcí při programování je rozhodování. Právě této problematice

Více

ALGORITMIZACE A PROGRAMOVÁNÍ

ALGORITMIZACE A PROGRAMOVÁNÍ Metodický list č. 1 Algoritmus a jeho implementace počítačovým programem Základním cílem tohoto tematického celku je vysvětlení pojmů algoritmus a programová implementace algoritmu. Dále je cílem seznámení

Více

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje f1(&pole[4]); funkci f1 předáváme hodnotu 4. prvku adresu 4. prvku adresu 5. prvku hodnotu 5. prvku symbolická konstanta pro konec souboru je eof EOF FEOF feof Správné vytvoření a otevření textového souboru

Více

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku Znaky - standardní typ char var Z, W: char; - znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku - v TP (často i jinde) se používá kódová

Více

Data, výrazy, příkazy

Data, výrazy, příkazy Data, výrazy, příkazy Karel Richta a kol. katedra počítačů FEL ČVUT v Praze Přednášky byly připraveny s pomocí materiálů, které vyrobili Ladislav Vágner, Pavel Strnad, Martin Hořeňovský, Aleš Hrabalík

Více

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek

Informační systémy 2008/2009. Radim Farana. Obsah. Dotazy přes více tabulek 5 Vysoká škola báňská Technická univerzita Ostrava Fakulta strojní, Katedra automatizační techniky a řízení 2008/2009 Radim Farana 1 Obsah Jazyk SQL, Spojení tabulek, agregační dotazy, jednoduché a složené

Více

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda

3. Je defenzivní programování technikou skrývání implementace? Vyberte jednu z nabízených možností: Pravda Nepravda 1. Lze vždy z tzv. instanční třídy vytvořit objekt? 2. Co je nejčastější příčinou vzniku chyb? A. Specifikace B. Testování C. Návrh D. Analýza E. Kódování 3. Je defenzivní programování technikou skrývání

Více

teorie logických spojek chápaných jako pravdivostní funkce

teorie logických spojek chápaných jako pravdivostní funkce Výroková logika teorie logických spojek chápaných jako pravdivostní funkce zabývá se způsoby tvoření výroků pomocí spojek a vztahy mezi pravdivostí různých výroků používá specifický jazyk složený z výrokových

Více

Dědění, polymorfismus

Dědění, polymorfismus Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá

Více

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata 1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata Studijní cíl Tento první blok celého kurzu zaměřen na zvládnutí základních pojmů z oblasti programování a

Více

1 Příklady pro druhý semestr PGL

1 Příklady pro druhý semestr PGL 1 Příklady pro druhý semestr PGL Jiří Fišer 1.1 Formátovač 1.1.1 Vytvoření aplikace pro snadné vytváření jednoduše strukturovaných dokumentů. Strukturované dokumenty musí podporovat sekce (=kapitoly) a

Více

První kapitola úvod do problematiky

První kapitola úvod do problematiky První kapitola úvod do problematiky Co je to Flex Adobe Flex je ActionSript (AS) framework pro tvorbu Rich Internet Aplications (RIA), tedy knihovna AS tříd pro Flash. Flex používáme k vytvoření SWF souboru

Více

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem

Více

Jazyk C# (seminář 5)

Jazyk C# (seminář 5) Jazyk C# (seminář 5) Pavel Procházka KMI 23. října 2014 Přetěžování metod motivace Představme si, že máme metodu, která uvnitř dělá prakticky to samé, ale liší se pouze parametry V C# můžeme více metod

Více

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií 1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední

Více

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni! Java práce s řetězci Trochu povídání.. Řetězce jsou v Javě reprezentovány instancemi tříd StringBuffer a String. Tyto třídy jsou součástí balíčku java.lang, tudíž je možno s nimi pracovat ihned bez nutného

Více

Dolování v objektových datech. Ivana Rudolfová

Dolování v objektových datech. Ivana Rudolfová Dolování v objektových datech Ivana Rudolfová Relační databáze - nevýhody První normální forma neumožňuje vyjádřit vztahy A je podtypem B nebo vytvořit struktury typu pole nebo množiny SQL omezení omezený

Více

Operátory ROLLUP a CUBE

Operátory ROLLUP a CUBE Operátory ROLLUP a CUBE Dotazovací jazyky, 2009 Marek Polák Martin Chytil Osnova přednášky o Analýza dat o Agregační funkce o GROUP BY a jeho problémy o Speciální hodnotový typ ALL o Operátor CUBE o Operátor

Více

Seminář Java II p.1/43

Seminář Java II p.1/43 Seminář Java II Seminář Java II p.1/43 Rekapitulace Java je case sensitive Zdrojový kód (soubor.java) obsahuje jednu veřejnou třídu Třídy jsou organizovány do balíků Hierarchie balíků odpovídá hierarchii

Více

Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1

Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1 Negativní informace Petr Štěpánek S použitím materiálu M.Gelfonda a V. Lifschitze 2009 Logické programování 15 1 Negace jako neúspěch Motivace: Tvrzení p (atomická formule) neplatí, jestliže nelze odvodit

Více

M4 PDF rozšíření. Modul pro PrestaShop. http://www.presta-addons.com

M4 PDF rozšíření. Modul pro PrestaShop. http://www.presta-addons.com M4 PDF rozšíření Modul pro PrestaShop http://www.presta-addons.com Obsah Úvod... 2 Vlastnosti... 2 Jak modul funguje... 2 Zdroje dat... 3 Šablony... 4 A. Označení šablon... 4 B. Funkce Smarty... 5 C. Definice

Více

Logické programování I

Logické programování I Logické programování I PROLOG Program popisuje "svět" Prologu = databáze faktů a pravidel (tzv. klauzulí). fakta: predikát(arg1, arg2,...argn). cíle:?- predikát(arg1, arg2,...argn). pravidla: hlava :-

Více

Datové typy strana 29

Datové typy strana 29 Datové typy strana 29 3. Datové typy Jak již bylo uvedeno, Java je přísně typový jazyk, proto je vždy nutno uvést datový typ datového atributu, formálního parametru metody, návratové hodnoty metody nebo

Více

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování.

Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově orientované programování. Delphi lekce 6 Minimum z Object Pascalu Vrátíme se ještě k základům Object Pascalu. Struktura programu Object Pascal je přísně typový procedurální jazyk, který umožňuje jak strukturované, tak objektově

Více

1. Programování proti rozhraní

1. Programování proti rozhraní 1. Programování proti rozhraní Cíl látky Cílem tohoto bloku je seznámení se s jednou z nejdůležitější programátorskou technikou v objektově orientovaném programování. Tou technikou je využívaní rozhraní

Více

boolean hasnext() Object next() void remove() Kolekce

boolean hasnext() Object next() void remove() Kolekce 11. Kontejnery Kontejnery Kontejnery jako základní dynamické struktury v Javě Kolekce, iterátory (Collection, Iterator) Seznamy (rozhraní List, třídy ArrayList, LinkedList) Množiny (rozhraní Set, třída

Více

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem

Jazyk C++ 1. Blok 3 Objektové typy jazyka C++ Třída. Studijní cíl. Doba nutná k nastudování. Průvodce studiem Jazyk C++ 1 Blok 3 Objektové typy jazyka C++ Studijní cíl Ve třetím bloku bude představen a rozebrán nejdůležitější objektový typ jazyka C++ a to sice třída. Po absolvování bloku bude student schopen navrhovat

Více

PB006 Principy programovacı ch jazyku pozna mky

PB006 Principy programovacı ch jazyku pozna mky PB006 Principy programovacı ch jazyku pozna mky - Výpisky ze slidů pana Škarvady. V podstatě nic není navíc, spíš se jedná o zkrácení a přeformátování. Za bezchybnost neručím! 1 Úvod 1.1 Aspekty programovacího

Více

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13

Obsah. Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 Úvod 11 Základy programování 11 Objektový přístup 11 Procvičování 11 Zvláštní odstavce 12 Zpětná vazba od čtenářů 12 Errata 13 KAPITOLA 1 Na úvod o Javě 15 Počítačový program 15 Vysokoúrovňový programovací

Více

Program a životní cyklus programu

Program a životní cyklus programu Program a životní cyklus programu Program algoritmus zapsaný formálně, srozumitelně pro počítač program se skládá z elementárních kroků Elementární kroky mohou být: instrukce operačního kódu počítače příkazy

Více

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007

WSH Windows Script Hosting. OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 WSH Windows Script Hosting OSY 2 Přednáška číslo 2 opravená verze z 15.10.2007 Co je skript? Skriptování nástroj pro správu systému a automatizaci úloh Umožňuje psát skripty jednoduché interpretované programové

Více

Funkcionální programování

Funkcionální programování Funkcionální programování Typované - Haskell Netypované - Lisp, Scheme λ-kalkul Teoretický základ funkcionálniho programování Lambda kalkul analyzuje funkce nikoli z hlediska původního matematického smyslu

Více

2. Modelovací jazyk UML 2.1 Struktura UML 2.1.1 Diagram tříd 2.1.1.1 Asociace 2.1.2 OCL. 3. Smalltalk 3.1 Jazyk 3.1.1 Pojmenování

2. Modelovací jazyk UML 2.1 Struktura UML 2.1.1 Diagram tříd 2.1.1.1 Asociace 2.1.2 OCL. 3. Smalltalk 3.1 Jazyk 3.1.1 Pojmenování 1. Teoretické základy modelování na počítačích 1.1 Lambda-kalkul 1.1.1 Formální zápis, beta-redukce, alfa-konverze 1.1.2 Lambda-výraz jako data 1.1.3 Příklad alfa-konverze 1.1.4 Eta-redukce 1.2 Základy

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Číselné vyjádření hodnoty. Kolik váží hrouda zlata?

Číselné vyjádření hodnoty. Kolik váží hrouda zlata? Čísla a logika Číselné vyjádření hodnoty Au Kolik váží hrouda zlata? Dekadické vážení Když přidám osmé závaží g, váha se převáží => závaží zase odeberu a začnu přidávat závaží x menší 7 závaží g 2 závaží

Více

Principy UML. Clear View Training 2005 v2.2 1

Principy UML. Clear View Training 2005 v2.2 1 Principy UML Clear View Training 2005 v2.2 1 1.2 Co je touml? Unified Modelling Language (UML) je univerzálníjazyk pro vizuální modelování systémů Podporuje všechny životní cykly Mohou jej implementovat

Více

Modely datové. Další úrovní je logická úroveň Databázové modely Relační, Síťový, Hierarchický. Na fyzické úrovni se jedná o množinu souborů.

Modely datové. Další úrovní je logická úroveň Databázové modely Relační, Síťový, Hierarchický. Na fyzické úrovni se jedná o množinu souborů. Modely datové Existují různé úrovně pohledu na data. Nejvyšší úroveň je úroveň, která zachycuje pouze vztahy a struktury dat samotných. Konceptuální model - E-R model. Další úrovní je logická úroveň Databázové

Více

Jazyk C++ II. Šablony a implementace

Jazyk C++ II. Šablony a implementace Jazyk C++ II Šablony a implementace AR 2013/2014 Jazyk C++ II Úvod Dědičnost a kompozice nejsou vždy tou správnou odpovědí na požadavky znovupoužitelnosti kódu. Proto máme možnost definování určité třídy

Více

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K. Virtuální počítač Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor Virtuální počítač Překladač Překladač : Zdrojový jazyk Cílový jazyk Analytická část:

Více

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

Bridge. Známý jako. Účel. Použitelnost. Handle/Body Bridge Bridge Známý jako Handle/Body Účel odděluje abstrakci (rozhraní a jeho sémantiku) od její konkrétní implementace předchází zbytečnému nárůstu počtu tříd při přidávání implementací používá se v době

Více

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný typem proměnné - ukazatel je tedy adresa společně s

Více

Metody tvorby ontologií a sémantický web. Martin Malčík, Rostislav Miarka

Metody tvorby ontologií a sémantický web. Martin Malčík, Rostislav Miarka Metody tvorby ontologií a sémantický web Martin Malčík, Rostislav Miarka Obsah Reprezentace znalostí Ontologie a sémantický web Tvorba ontologií Hierarchie znalostí (D.R.Tobin) Data jakékoliv znakové řetězce

Více

PREPROCESOR POKRAČOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,

Více

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include

9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h> 9.3.2010 Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include int main(void) { int dcislo, kolikbcislic = 0, mezivysledek = 0, i; int vysledek[1000]; printf("zadejte

Více

PB161 6. přednáška (26. října 2015)

PB161 6. přednáška (26. října 2015) PB161 6. přednáška (26. října 2015) Standardní knihovna C++ obsahuje řadu částí, některé už jsme viděli (strings, I/O streams) mimo jiné obsahuje i knihovní funkce ze standardní knihovny jazyka C jiné

Více

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve

Více

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu

VÝUKOVÝ MATERIÁL. Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632 Číslo projektu VÝUKOVÝ MATERIÁL Identifikační údaje školy Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace Bratislavská 2166, 407 47 Varnsdorf, IČO: 18383874 www.vosassvdf.cz, tel. +420412372632

Více

Seminární práce z Teorie ICT

Seminární práce z Teorie ICT ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA V PRAZE Provozně ekonomická fakulta Seminární práce z Teorie ICT Implementace logické hádanky v Prologu Autor : Petr Pechek 1 Popis zvoleného problému Mým úkolem bylo vyřešit

Více

Knihovna XmlLib TXV 003 63.01 druhé vydání říjen 2012 změny vyhrazeny

Knihovna XmlLib TXV 003 63.01 druhé vydání říjen 2012 změny vyhrazeny Knihovna XmlLib TXV 003 63.01 druhé vydání říjen 2012 změny vyhrazeny 1 TXV 003 63.01 Historie změn Datum Vydání Popis změn Prosinec 2010 1 První vydání, popis odpovídá XmlLib_v13 Říjen 2012 2 Druhé vydání,

Více

Rozšíření ksh vůči sh při práci s proměnnými

Rozšíření ksh vůči sh při práci s proměnnými Rozšíření ksh vůči sh při práci s proměnnými (X36UNX, Jan Skalický, 2006) Pole homogenní lineární struktura implicitn ě s číselným rozsahem index ů 0...1023 (někde 4095) implicitn ě řetězcov ě orientovaná

Více

Funkcionální programování

Funkcionální programování Funkcionální programování Scheme ale i trochu C#, Boo, Perlu, Smalltalku apod. Jiří Fišer MMVIII Funkcionální paradigma funkcionální paradigma je jedním z klasických paradigmat programování (podobně jako

Více