# Ú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
```