Deklarace v Go mají svou logiku
Ještě jednou se vrátím k jazyku Go. Jedním z
jeho prvků, který vzbudil největší emoce, je syntaxe
deklarací, která je poměrně odlišná od deklarací v C/C++. Rozdíl ukážu na
příkladu deklarace pole pěti ukazatelů na int
:
C/C++:
int * a[5];
Go:
var a [5] * int;
Soudě podle ohlasů na internetu, hodně lidem přijdou deklarace v Go
neintuitivní a "pozpátku". Pokud se na ně ale podíváme podrobněji, zjistíme, že
na rozdíl od deklarací v C/C++ mají velice průhlednou vnitřní logiku –
čtou se totiž vždy zleva doprava. Schválně si zkuste druhou
deklaraci přeříkat slovy: "proměnná a
je pole pěti prvků, které
obsahuje ukazatele na int
." Bylo to jednoduché, že? A výsledek
odpovídá tomu, jak byste tuto deklaraci nejspíš popsali slovy sami.
Čtení deklarací v C/C++ je oproti Go docela náročné, musí se postupovat od
deklarovaného identifikátoru (nebo typu, pokud jsme v typedef
) "cik
cak směrem ven" a brát v úvahu závorky. Do intuitivity to má daleko a rozlišit
na první pohled třeba mezi typy "ukazatel na funkci" a "funkce vracející
ukazatel" chce cvik.
Neviděl jsem to už někde?
Pamětníci si možná všimli, že deklarace Go jsou v podstatě shodné s deklaracemi v Pascalu – ty se také čtou zleva doprava, ale jsou poněkud upovídanější. Náš příklad by v Pascalu vypadal takto:
var
a: array[0..4] of ^Integer;
Je pravděpodobné, že ani Pascal nebyl se tímto zápisem deklarací originální. Nicméně by mě docela zajímalo, zda autoři Go nezávisle "objevili kolo", nebo se jen inspirovali.
Co to zkusit obráceně?
Při zkoumání deklarací v Go mě napadlo, že když přijdou většině lidí "pozpátku", možná by nebyl marný nápad zachovat linearitu, ale otočit směr. Co kdyby naše ukázková deklarace vypadala následovně:
var int * [5] a;
Při čtení zleva doprava tento způsob zápisu možná není tak intuitivní ("vezmu
int
, udělám na něj ukazatel, zabalím do pole pěti prvků a pojmenuju
a
"), ale možná by céčkařům mohl být bližší. Nevýhodou je, že zápis
strukturou trochu připomíná německé věty – to podstatné (deklarujeme pole)
se objeví až na konci.
Jak jsem posléze zjistil, nevymyslel jsem nic nového – přesně tento způsob zápisu používá například C#.
A není jedno, jak deklarace píšeme?
Možná vás napadlo, zda se tu nerýpu v nepodstatných detailech a zda má smysl se syntaxí deklarací takto podrobně zabývat. Možná ano, možná ne. Syntaxe deklarací je na jednu stranu poměrně povrchní aspekt jazyka a jejich čtení do značné míry otázka zvyku. Na druhou stranu ale zápis deklarací značně určuje "feel" jazyka a z reakcí na Go je zřejmé, že lidem na něm záleží.