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ží.