sabato 21 gennaio 2017

Da 5 a 6: i sigilli in Perl 6

Una delle prime difficoltà mentali che ho incontrato nell'apprendere Perl 6 è stata la variazione dell'uso dei sigilli, e non perché fosse difficoltosa in sé (anzi risulta semplificata!), ma perché mi appariva incoerente.
In Perl 5 era abbastanza facile, almeno per me, comprendere che $ indicava "un singolo elemento", fosse questo un valore di array, hash o un riferimento (ad un oggetto, sub o altro).
In Perl 6 la cosa non è così e infatti il sigillo del tipo di "container" rimane invariato per tutto il ciclo di vita, e questo significa che ad esempio un array avrà sempre @ come sigillo anche quando si vuole accedere ad un singolo elemento di questo.
Per maggiori dettagli si legga ad esempio "A sigil is for life, not just for value type" nella Exegis 2 .
La cosa che inizialmente mi disturbava era che il sigillo $ era in un certo senso "sovraccaricato": funzionava per i normali scalari (es. stringhe, numeri) e anche per gli oggetti. Si noti che questo è esattamente il comportamento che si ha in Perl 5, quindi perché scomodarsi a variare i sigilli degli altri cointainers?
La spiegazione mentale che mi sono dato è intrinseca al fatto che in Perl 6 tutto è un oggetto (un po' come in Ruby): anche le stringhe sono oggetti, così come i numeri, ecc.

% perl6

> "hello".^name
Str
> 10.^name
Int

In un certo senso questo significa che il sigillo $ viene usato come "singolo oggetto", non piu' come "scalare primitivo o oggetto", perché di fatto non esistono piu' "scalari primitivi".

E la pace è tornata nella mia mente!

Nessun commento: