Ještě k výjimkám a control flow =============================== Failures -------- failure -- objekt obalující nevyhozenou výjimku, typicky jako návratová hodnota funkce. sub load($fn) { if (!$fn.IO.e) { return Failure.new(X:IO::DoesNotExist(path => $fn)); <-- vrátí Failure objekt fail X:IO::DoesNotExist(path => $fn); <-- zkratka za totéž fail "File not found: $fn"; <-- fail s ad-hoc výjimkou } slurp $fn; } load("file.txt") <-- ignorovali jsme Failure, vyhodí výjimku load("file.txt").lc <-- pokoušíme se s Failure pracovat jako s normální hodnotou, vyhodí výjimku my $ret = load("file.txt") <-- ok, $ret je Failure (load("file.txt") // "default").lc <-- ok, Failure je undef, použije se default with load("file.txt") { ... } <-- ok, při chybě se blok přeskočí Phasery ------- Obecný zápis: NĚJAKÝ_PHASER { blok } Blok není spuštěn hned, ale v reakci na nějakou událost danou phaserem. CATCH <-- zachycení výjimky LEAVE <-- při každém opuštění bloku (i vyhozením výjimky) -- jako finally KEEP <-- při úspěšném opuštění bloku UNDO <-- při neúspěšném opuštění bloku (výjimky propaguje bez zachycení dál) CONTROL <-- zachycení control-flow exceptions (return, next, etc.) FIRST <-- při prvním vstupu do bloku (na začátku první iterace smyčky) LAST <-- na konci poslední iterace smyčky NEXT <-- na konci každé iterace smyčky (i když byla ukončena next) BEGIN <-- vyhodnocení v čase kompilace (jen jednou) INIT <-- vyhodnocení za runtime, ale co nejdříve (jen jednou) Další ----- let $var = 42; <-- při úspěšném ukončení bloku hodnota zůstane, při neúspěšném vrácena původní once { blok; } <-- blok se provede jen jednou (např. při první iteraci smyčky nebo prvním zavolání funkce) Pozor: for (^3) { .say; once { say "once" }; FIRST { say "first" } } Vypíše: first, 0, once, 1, 2 (phasery jdou mimo běžný tok kódu, once ne) Unicode ======= Odkazy na Unicode 9.0.0: [s1] -> stránka standardu, [p1] -> stránka Code charts - snaží se reprezentovat znaky všech světových abeced - reprezentuje znaky (sémantiku), nikoli glyfy (konkrétní grafickou podobu) - snaží se o vztah 1:1 se všemi používanými kódováními => nesystematičnosti ### Codepointy ### - prostor velikosti 17 x 2^16 - 0000-007f: ASCII včetně řídicích znaků [p2] - 0080-00ff: iso-8859-1 včetně řídicích znaků [p7] - rozšířená latinka 1 [p12] - pre-komponované znaky s diakritikou - 0130, 0131: turecká i (locale-dependent vztah velké<->malé) - rozšířená latinka 2 [p17] - podivná písmena používaná třeba v afrických jazycích - 01C4-01C7: chorvatské dvojznaky (rozlišení uppercase/lowercase/titlecase) - fonetická abeceda (IPA) [p23] - kombinující diakritika [p31] - řečtina a koptština [p35] - nejrůznější varianty cyrilice [p39] - všelijaká interpunkce [p230] - mezery různých šířek [s304], zero-width (no)breaking space, (non)joiners - různé pomlčky [s306] - uvozovky [s309] - symboly - šipky [p248] - matematické symboly [p251], matematické varianty [p1510] - technické symboluy [p258] - všehochuť [p280] - kombinující diakritika [p239] - CJK = unifikovaná čínština + japonština + korejština [e.g. p411] - obskurnosti - egyptské hieroglyfy [p1363] - hlaholice [p322] - disk z Faistu [p1215] - speciální notace - Braille [p298] - hudební [p1498] - domino [p1560] - emotikony [p1590], kombinující modifikátory barvy pleti :) - zpětná kompatibilita - pre-komponované znaky - zlomky a římská čísla [p245] - ligatury [p1163] - mnoho konců řádků: 000D CR, 000A LF, CR+LF, 0085 NEL, 2028 line separator, 2029 paragraph separator - private-use oblasti: E000-F8FF, F0000-FFFFD, 100000-10FFFD - neoficiální registr privátních znaků (třeba klingonština) ### Reprezentace ### - UCS-2 (historické: pouze 2^16 znaků, BE+LE varianta, BOM) - UCS-4 alias UTF-32 (BE+LE varianta) - UTF-16 - reprezentace všech codepointů pomocí 16bitových kódů - surrogates: D800-DBFF high, DC00-DFFF low - UTF-8 - nadmnožina ASCII, ostatní znaky mají 2 až 4 byty - podmínky na normalizaci: <0x110000, nejkratší kód - neoficiální rozšíření na 64-bitová čísla (Perl5) - samosynchronizující, zachovává lexikografické pořadí - nešvar s BOM - UTF-7, Punycode a další ### Tabulky vlastností ### - jméno - general category [s211] - další binární vlastnosti (PropList.txt) - způsob zobrazování (např. směr psaní) - upper/lower/titlecase mappings - numerická hodnota - dekompozice (normální a ) - canonical combining class ### Normální formy ### - kanonická dekompozice (NFD) - akcenty uspořádány podle combining class - v rámci combining class pořadí zachováno - kanonická kompozice (NFC) - používáme pre-komponované znaky, kdekoliv možno - kompatibilní (de)kompozice (NFKD, NFKC) - standard slibuje stabilitu normálních forem Stringy v P6 ============ - zdroják je v UTF-8 - \x[2615] <-- codepoint - \c[HOT BEVERAGE, COMBINING LONG SOLIDUS OVERLAY] <-- codepointy - \c[NBSP] <-- alias pro codepoint - \c[woman gesturing OK] <-- pojmenovaná posloupnost codepointů ### Str ### - is Cool does Stringy - NFG: posloupnost grafémů (znak + kombinující codepointy) (pro srovnání: C# a Java pracují v UTF-16, Python 3 v UTF-32) - "X\c[COMBINING CARON]".chars = 1 - "X\c[COMBINING CARON]".codes = 2 - .uc .lc .tc .tclc <-- transformace velikosti písmen - "\c[DEVANAGARI DIGIT TWO]".unival = 2 <-- numerická hodnota - "\c[SNOWMAN]".encode('utf-8') --> Blob (utf8) (zatím je podporováno jen pár kódování, chybí třeba iso-8859-2) ### Uni ### - does Positional[uint32] does Stringy - posloupnost codepointů - potomci: třídy NFC, NFD, NFKC, NFKD - "žďáření".NFD - Uni.new(0x41, 0x68, 0x6f, 0x6a, 0x263a).Str ### Buf / Blob ### - mutable / immutable binární data - Blob[::T = uint8] does Positional[T] does Stringy - Buf does Blob - specializace: {blob,buf}{8,16,32,64} - blob8.new(1..20).unpack("N3")>>.base(16) <-- unpack je experimentální