Dneska bych se chtěl mrknout na implicitní číselné typy v jazyce Haskell (podle specifikace z roku 1998, příklady odzkoušeny v GHC 6.10). Jak určitě víte, tak při použití funkcí jako je read :: Read a => String -> a
je nutné specifikovat, co má být výsledným typem. Pokud zavoláte jenom read "143"
, tak překladač nedokáže automaticky odvodit konkrétní typ takového výrazu (netuší, že chcete z řetězce získat číslo typu Int
). Řešením je typ výrazu explicitně zadat, čili read "143" :: Int
. Tato nejednoznačnost se ale netýká jen takovýchto výrazů, ale i zdánlivě "jasných" výrazů.
programování
Jelikož programuji a zajímám se i o jiné jazyky než je C a C++ (Python, Haskell, Java, SQL, PHP, HTML/XML, CSS, JavaScript, LaTeX, Vimscript, minoritně o Prolog či různé assemblery, dříve Pascal), tak jsem se rozhodl, že občas napíšu i nějakou zajímavost z ostatních jazyků. Nebude to nijak závazné, ani neplánuji žádný pravidelný seriál, ale když při studiu/programování narazím na nějakou zajímavost, tak ji sem možná napíšu :). Témata na tom budou (co se týče obtížnosti) různá - především se ale asi bude jednat o pokročilá témata.
Minule se mně sice nikdo s řešením neozval (nevím, zda to bylo náročností úlohy nebo prostě tím, že jsou prázdniny), ale nevadí, zkusíme jinou úlohu :). Tentokrát jsem si hádanku vypůjčil z jednoho zdroje, který a priori uvést nemohu, protože pak byste se místo samotného řešení pokoušeli hledat řešení v onom zdroji :), ale po zveřejnění řešení ho samozřejmě uvedu. Kód jsem ale mírně upravil, aby to bylo zajímavější, takže není úplně shodný. Tentokrát se budou moct zapojit i ti, kteří znají "jen" Jazyk C.
Po půl roce sucha (konečně) přináším další zajímavou programovací úlohu. Tentokrát se jedná o úlohu pro programátory v C++ a na své si přijdou především milovníci bitových manipulací :). A nebojte, nebude to žádná úloha stylu "vytvořte makro pro vzájemné prohození polovin předaného intu".
Valgrind je open-source nástroj, který slouží především pro ladění paměťových chyb (umí toho víc, např. profilování, ale tím se teď zabývat nebudu). V tomto příspěvu bych se chtěl ukázat jeho možnosti, co se týče detekce problémů při práci s pamětí a to tak, že vždy uvedu jednoduchý příklad kódu (omezím se na jazyk C, ale valgrind zvládá programy napsané v libovolném jazyce, ať už je výsledek kompilovaný či interpretovaný, ovšem hlavně se používá pro programy napsané v C a C++), ve kterém se nachází paměťová chyba a ukázku, jakým výstupem na tuto chybu zareaguje valgrind.
Většina programátorů ví o tom, že některé konstrukce mají tzv. nedefinované chování a že by se jim měli vyhýbat. Méně se ale už ví, že kromě nedefinovaného chování norma definuje další typy chování: "specifikované", implementačně závislé a nespecifikované. Po přečtení tohoto příspěvku byste měli mít jasno, jaký je mezi těmito chováními rozdíl a kterým z nich se vyhýbat.
Našel jsem zajímavý C++ kvíz.
Každý jazyk obsahuje určitou množinu klíčových slov a množinu rezervovaných slov (ta může být i prázdná, např. v jazyce Fortran, což má za následek možnost solidně zmást případného čtenáře zdrojového kódu :)) a programátor si časem osvojí většinu z těch, která se běžně používají (nebo nepoužívají, ale jsou nechvalně známá, např. goto). Kromě nich ale občas v jazyce existují klíčová slova méně známá, která, ať už z důvodu toho, že jejich význam pozbyl důležitosti či je většina překladačů nepodporuje, nebo se používají pouze ve speciálních případech. V tomto příspěvku bych se chtěl zaměřit na takováto klíčová slova v jazycích C a C++.
C++ v rámci větší uživatelské přítulnosti poskytuje kromě přetěžování (overload) funkcí/metod také implicitní (default) hodnoty parametrů funkcí/metod (na rozdíl od Javy, u které mně tento syntaktický cukr celkem chybí). Většina programátorů v C++ o tom ví a tuto skutečnost využívá. Co už se ale ví méně, je to, že implicitního parametr funkce nemusí být konstanta. V tomto příspěvku se nebudu zabývat tím, do jaké míry je to vhodné a použitelné (ve většině případů to totiž opravdu vhodné není), ale pouze tím, co C++ v tomto směru umožňuje.
Oproti Java Generics či C# Generics (které jsou vlastně pouze typově parametrizované třídy) jsou šablony v C++ velice mocný nástroj - o tom určitě nikdo nepochybuje. Co se ale ví už méně, tak je to, že tento prvek jazyka C++ je turingovsky úplný (Turing-complete), čili, lidově řečeno, pomocí něj lze vyjádřit libovolný výpočet. Z toho plyne zajímavý důsledek, který bych chtěl uvést v tomto příspěvku.