# Úloha: Výrazy II Následující obsah je rozšířením úlohy Výrazy I. ## Zavedení jmenných prostorů Výrazy jsou umístěny ve jmenných prostorech. Po spuštění aplikace je vytvořený jmenný prostor `default` který je použitá jako výchozí. Jmenné prostory jsou od sebe oddělené, více jmenných prostorů tedy může obsahovat výraz stejného jména. Název jmenného prostoru se skládá ze znaků a-z a '_'. Definice jména výrazu se mění. Nová definice je následovná: `{namespace-name}.{name}`. Kde `{namespace-name}` je jméno jmenného prostoru a `{name}` odpovídá původní definici jména výrazu. Při výpisu výrazu pomocí funkce `print` se vypíší všechny jmenné prostory mimo výchozího. Příklad je uveden níže. ## Ošetření chyb Pomocí vyjimek vhodně ošetřete chybové stavy aplikace. Pokud není pro chybový stav specifikováno chování, vypište na standardní výstup zprávu `Operation failed.`. Všechny funkce selžou, pokud: - nemají validní syntax nebo vstupní argumenty - používají neexistující jmenný prostor. V takovém případě vypište na standardní výstup zprávu `Namespace '{namespace}' does not exists!`. Kde {namespace} je jméno chybějícího jmenného prostoru. Mimo to následující funkce selžou také pokud: - `unset` : výraz daného jména neexistuje. - `evaluate` : výraz daného jména neexistuje. - `print` : výraz daného jména neexistuje. - `rename` : zdrojový výraz daného jména neexistuje. - `copy` : zdrojový výraz daného jména neexistuje. Pokud uživatel zadá neznámý příkaz, vypište na standardní výstup zprávu `Unknown command.`. Příklad použití: ``` this-is-invalid-command > Unknown command. set > Operation failed. set a bc > Operation failed. set = !! > Operation failed. print not_exists > Operation failed. unset not_exists > Operation failed. ``` Pro potřebu tohoto zadání není třeba řešit zacyklené výrazy. ## Funkce pro správu jmenných prostorů Pro podporu jmenných prostorů implementujte následujíc funkce: - `namespace create {namespace-name}` - vytvoří jmenný prostor daného jména - `namespace use {namespace-name}` - nastaví vybraný jmenný prostor na výchozí - `namespace list` - vypíše všechny jmenné prostory setříděné dle abecedy. Příklad použití: ``` namespace list > default set a = 5 namespace create object namespace list > default > object namespace use object set area = * a a set a = 3 evaluate area > 9 rename default.a a evaluate area > 25 ```