The Way of the Camel The Apocalypse OOP Demo Perl6 The way of the camel Luca “Syslac” Mezzalira Montebelluna Linux User Group 26 gennaio 2011 – Montebelluna Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Licenza d’utilizzo c 2010, Luca “Syslac” Mezzalira. Copyright Questo documento viene rilasciato secondo i termini della licenza Creative Commons (http://creativecommons.org). L’utente è libero di: distribuire, comunicare al pubblico, rappresentare o esporre in pubblico la presente opera alle seguenti condizioni: Attribuzione Deve riconoscere la paternità dell’opera all’autore originario. Non commerciale Non può utilizzare quest’opera per scopi commerciali. Share-Alike Puoi distribuire eventuali modifiche a quest’opera solo con licenza identica o equivalente a questa. In occasione di ogni atto di riutilizzazione o distribuzione, deve chiarire agli altri i termini della licenza di quest’opera. Se ottiene il permesso dal titolare del diritto d’autore, è possibile rinunciare a ciascuna di queste condizioni. Le utilizzazioni libere e gli altri diritti non sono in nessun modo limitati da quanto sopra. Questo è un riassunto in lingua corrente dei concetti chiave della licenza completa (codice legale), reperibile sul sito Internet http://creativecommons.org/licenses/by-nc-sa/3.0/legalcode Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Sommario 1 The Way of the Camel Da dove veniamo Dove siamo Dove andiamo 2 The Apocalypse sub References HHP 3 OOP Tutto è un oggetto Classi Grammars 4 Demo Divertirsi con le liste Smart Perl Varie Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Da dove veniamo Disclaimer Non è un corso Sarebbe incredibilmente presuntuoso pensare di poter fare un corso di programmazione in due ore. Altrettanto sarebbe pensare di poter fare un corso di perl6 in due ore. Quindi, questo non è un corso, ma una panoramica delle novità più interessanti del perl6, per invogliare chi è interessato ad iniziare davvero e dargli qualche strumento per farlo. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Da dove veniamo Disclaimer Attenzione : progetto in sviluppo Perl6 è un progetto ancora attivamente sviluppato. Alcuni dei comportamenti descritti in questa presentazione erano radicalmente diversi solo all’inizio di quest’anno. Nel frattempo si è arrivati ad una situazione più stabile, ma non ci sono garanzie di blocco delle feature. Esempi Anche stavolta sono l’autore degli esempi, quindi . . . meglio starci attenti :D Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Da dove veniamo Antefatto : Perl è morto Limitazioni Concorrenza In pochi ormai penserebbero di usare il Perl come strumento per un progetto di una certa dimensione, per limitazioni implicite del linguaggio. Inoltre, PHP in ambito web, e Python e Ruby in generale si sono evoluti più rapidamente fino a rendere il Perl una scelta di nicchia. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Da dove veniamo La concorrenza, appunto. . . Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Da dove veniamo Cosa si è fatto Nuovo millennio, nuovo linguaggio Già nel 2000 c’erano problemi evidenti. Si è quindi iniziato a pensare ad una riscrittura completa, non backwards-compatible. Il perl6, appunto. Contro Pro Il progetto era coraggioso e ha permesso di sistemare realmente alcuni problemi. Perl6 Il progetto era troppo coraggioso; infatti, fino al 2008-2009 i risultati non sono stati esaltanti (perl6 restava inutilizzabile) MontelLUG The Way of the Camel The Apocalypse OOP Demo Da dove veniamo Particolarità Nuovo logo : 1 Specifica Interpreti La specifica del linguaggio (Synopses) è stata sviluppata indipendentemente da ogni sua implementazione Risultato : ci sono “più perl6”, dato che ogni interprete che segue la specifica è, in qualche senso, ufficiale 1 Perl6 Anche se non è un logo, ma un rilevatore di troll MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove siamo Confusi? Non ce n’è bisogno! La comunità, da qualche anno, ha scelto di puntare forte su una sola, Rakudo. Ogni distribuzione ha portato, o porta, il suo contributo Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove siamo Rakudo Negli ultimi anni, Rakudo Perl si è affermato come lo standard di fatto tra le distribuzioni di perl6. Risorse In pratica, la quasi totalità della documentazione su perl6 è basata su Rakudo. Perl6 Versioni * (leggi star) Da luglio 2010, ogni mese viene rilasciata una versione * di Rakudo, a useful and usable distribution of Perl 6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove siamo Dietro a Rakudo Rakudo gira su Parrot (http://www.parrot.org); direttamente dalla descrizione del sito “una virtual machine progettata per compilare ed eseguire efficientemente linguaggi dinamici”. TAP Inoltre, la quantità di test automatici dietro a Rakudo è impressionante, anche se la maggior parte vengono da un altro interprete, pugs Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove siamo Cosa funziona Tutto? No, non tutto, ma quasi.a In ogni caso, funzionano un sacco di features interessanti, che la rendono valida almeno come piattaforma da esperimenti. a Perl6 I dettagli a http://rakudo.org/status MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove siamo “Problemi” noti Premature optimization is the root of all evil Speed So già che i programmatori “professionisti” si lamenteranno della velocità di esecuzione, quindi è meglio dirlo subito . . . Rakudo è lento, anche molto lento. Ma non è ancora il momento di ottimizzarlo. -O fun Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove andiamo Previsioni Difficult to see. Always in motion is the future. – Yoda Synopses Le specifiche del linguaggio ormai hanno un certo grado di maturazione, difficilmente vedranno cambiamenti sostanziali. Rakudo Credo che la prima grande ondata di hacking sia finita, e che vedremo principalmente bugfixes, piccole migliorie e miglioramenti di performance nel prossimo futuro. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove andiamo I can has users? Lo sviluppo davvero interessante, però, potrebbe essere un altro. Utenti Applicazioni scritte in perl6 Moduli Un equivalente del CPAN con nuovo codice Media Reale attenzione del pubblico sul progetto Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Dove andiamo Moar userz! Infatti, finora il problema è stato : Incompleto ⇒ pochi utenti Pochi utenti ⇒ pochi test/applicazioni reali/bug report/etc Poche applicazioni ⇒ poche correzioni Poche correzioni ⇒ Incompleto Ma le rakudo star stanno appunto cercando di cambiare questo stato, per non finire così : Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Qualcosa è cambiato use v6; Le migliorie rispetto al perl usato finora ci sono davvero, e sono notevoli. Vediamo i cambiamenti più evidenti e importanti Classi Il modello ad oggetti è completamente ripensato Subs Il programmatore ha molto più controllo sulle subroutines. References Quasi completamente scomparse. Grammars Novità dal lato parsing di testo. Lambda Il paradigma funzionale è pienamente utilizzabile. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo sub Signature Anche in Perl sarà possibile definire delle funzioni in questo modo : sub esempio (Num $i) Types Si possono fare costrizioni di tipo, al di là di $ @ % sub esempio2 (String :$testo) Named Si possono passare, e obbligare a passare, parametri con nome Pur mantenendo anche le possibilità del perl5 di passaggio di callables ed altre cose divertenti. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo sub sub esempio3 ($i is rw, $j is copy, $k is readonly) Passaggio Si ha assoluto controllo sul passaggio per valore/riferimento/etc. sub esempio4 ($i is rw, *@rest) Slurpy Si può fare in modo che tutti i parametri “opzionali” vengano inglobati in un’unica variabile. sub esempio5 ($i is rw, *%rest) Slurpy hash Uguale, ma %rest contiene tutti i parametri passati per nome. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo sub Where Si possono forzare anche controlli più precisi sugli argomenti : sub sqrt(Num $i where {$i > 0 }) { ... } Potere . . . illimitato Notare che si può inserire qualunque blocco di codice valido. L’unica cosa a cui fare attenzione è che il controllo verrà eseguito ad ogni esecuzione della funzione; può quindi pesare su funzioni usate spesso. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo sub Multis Ora che abbiamo controllo sugli argomenti di una funzione, niente ci impedisce di sovraccaricare : multi sub somma (Int $a, Int $b) { say $a+$b; } multi sub somma (String $a, String $b) { say $a ~ $b; } Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo References Flattening Qual è stata una delle scelte più criticate del perl? Auto-flattening degli array array di array? passaggio di array divisi a funzioni? ⇒ References! Oggetti? ###Perl5 code my @a = (1,2,3); my @b = (4,5,6); divisi(@a,@b); ### All’interno di function ho perso ogni info ###sul fatto che @a e @b fossero due array distinti Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo References Nuovo approccio In Perl6 questo non è il comportamento di default, se la funzione ha una signature pensata per tenerli divisi. In ogni caso, Perl vi lascia sempre la possibilità di tirarvi la zappa sui piedi (sapendo che può essere utile in altri casi) sub divisi(@a, @b){...} # Se chiamata come prima # mantiene la distinzione; sub prova (*@tutto) {...} # Invece ## Al momento della chiamata prova(|@a, |@b) ## Appiattisce esplicitamente l’argomento @arr = [1,2],[3,4] ## Matrice Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo References Morale Non è saggio pensare che le references siano completamente sparite dal perl6. Tuttavia, grazie a : Maggior controllo sugli argomenti delle funzioni Nuova sintassi per creazione/accesso array Classi ed oggetti rivisti Il loro uso è diventato decisamente trasparente per l’utente, che può anche ignorarle quasi completamente. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo HHP Higher Order Perl Già perl5 permetteva, a chi era interessato, di esplorare la programmazione funzionale 2 Perl6 ormai dà “supporto ufficiale” a questo paradigma di programmazione. Vediamo come 2 Per chi è interessato, appunto, ottimo libro Higher Order Perl, M.J. Dominus Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo HHP Cosa Le funzioni sono oggetti che possono essere passati come argomenti, ritornate, modificate, etc. I metodi “standard” spessissimo sono scritti in modo da essere side-effect-free, cioè ritornare la versione modificata piuttosto che modificare l’argomento Un blocco racchiuso da {} di default dà origine ad una closure Valutazione lazy delle liste ovunque possibile. Currying reso facile. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo HHP Currying Usiamo assuming sub exp_prova($a, $b) { say $a**$b } my &exp2 = &exp_prova.assuming(2); Lazy lists Ogni elemento non viene calcolato finché necessario, rendendo possibile dichiarare anche liste infinite. my @list = 1,2 ... Inf; Closures & captures Si possono creare funzioni anonime in ogni momento; è usato ad esempio per dare nomi alle variabili nei loop; for @array -> $a, $b { say $a ~ $b } Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Tutto è un oggetto Ma davvero tutto Perl6 è un linguaggio realmente orientato agli oggetti Qualunque tipo abbia una variabile, compresi i builtin e gli &, sono oggetti A livello più tecnico, ogni tipo di dato eredita da Any Effetti concreti? Vediamo un esempio ## Si può scrivere my $val = 3.14.sin my $shout = “ciao”.uc Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Tutto è un oggetto Conosci te stesso L’altro effetto di questa scelta sarà probabilmente ben noto ai programmatori Python 3 Il codice stesso può ispezionare gli oggetti per sapere cosa farne. Esempi ## Argomenti di una funzione say &prova.signature.params ## Metodi chiamabili su un numero say 3.14.^methods 3 Perl6 Infatti, probabilmente l’ispirazione non è casuale MontelLUG The Way of the Camel The Apocalypse OOP Demo Classi class, finalmente Le influenze Moose per perl5 Anche se in realtà è stato Moose a prendere da perl6, le feature sono simili Linguaggi oop classici Sintatticamente, perl6 inizia ad assomigliare ad un linguaggio “normale” Vediamo da vicino cosa la v6 ha tenuto e cosa ha cambiato rispetto alle versioni precedenti. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Classi Esempio class Client { has $!number has $.ip has $.connected is rw method new ($ip) { return self.bless(*,:$ip); } } Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Classi Buttati Package Perl6 ha abbandonato la relazione classe-Package che esisteva finora. Hash Non c’è più l’uguaglianza tra oggetto e *-reference (di solito hash) Dati Quindi, i membri dell’oggetto compaiono in quanto tali, con le loro proprietà Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Classi Tenuti Bless La libertà nella forma del costruttore, e la funzione per l’effettiva creazione dell’oggetto, sono rimaste. Creazione Leggermente più in profondità, rimane anche il fatto che il costruttore crea realmente l’oggetto, non si limita a modificarne lo stato, come in C++ o Java. Ereditarietà L’idea alla base è chiaramente la stessa, anche se ci siamo liberati di @ISA Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Classi Brand new - Accesso Controllo dell’accesso ai dati membri. $! L’argomento è privato. $. L’argomento è privato, ma viene automaticamente creato un metodo con lo stesso nome per accedervi (“pubblicamente”) $. Perl6 is rw L’argomento è privato, ma viene automaticamente creato un metodo con lo stesso nome per accedervi, che può modificare il dato. MontelLUG The Way of the Camel The Apocalypse OOP Demo Classi Brand new - Ruoli Role Bearer { has $!ring; } Class Bilbo does Bearer { }; Class Frodo does Bearer { }; Conflitti Idea alternativa all’ereditarietà multipla, con controllo maggiore sui conflitti. Runtime Si possono assegnare ruoli a classi a runtime. Templating Uno dei modi più comuni di usare programmazione generica in un progetto è inserirla in un ruolo. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Grammars Grammars L’idea Creare delle “classi” per espressioni regolari. Rendere organizzato il parsing del testo. Avere degli oggetti rappresentanti i “match”, su cui lavorare. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Grammars Esempio : .fluxbox/apps grammar Apps { rule TOP {^ [<option>|<program>]+ $} rule option { <index> <value>\n } rule program { <header> [\t*<option>]+ <fine> } rule header { <index> <descr>\n } rule fine { \[ end \]\n } token index { \[ .+? \] } token value { \{ .+? \} } token descr { \( .+? \) } } Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Grammars Più da vicino Vediamo intanto l’utilizzo : if my $parsed = Apps.parsefile(’~/.fluxbox/apps’) { say join "\n", @($parsed<program>); say join "\n", @($parsed<option>); } Potrei come in questo esempio usarlo per scoprire quali parti del file parlano di opzioni di startup e quali di opzioni di programmi. Ma andiamo al di là dell’esempio particolare, che è meglio ... Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Grammars Possibilità Estensibilità Proprio come per le classi, si possono creare “grammatiche figlie”; ad esempio per permettere i commenti nel file precedente. TOP La regex TOP è quella che viene testata se si esegue il match sulla grammatica, senza specificare altro. Dati Volendo, si possono specificare delle “azioni” ad esempio per costruire un albero dei match. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo “Talk is cheap. Show me the code” – Linus Torvalds Abbiamo visto perché perl6 dovrebbe essere fantastico È ora di vedere perché perl6 è veramente fantastico. E quale modo migliore di farlo che con qualche esempio funzionante? Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste Le possibilità Se venite da MatLab/Octave e sentite la nostalgia degli operatori puntuali Se vi capita spesso di applicare metodi ad ogni elemento ma la sintassi di map vi confonde Se volete un modo facile per sommare/moltiplicare/etc tra loro tutti gli elementi di una lista Non preoccupatevi, perl6 fa tutto questo e di più :D Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste Ci vuole metodo Supponiamo di avere una lista di persone4 e che io abbia per un momento dimenticato la grammatica italiana. my @names = <linus richard larry eric>; ## Oh, no! Sono tutti nomi propri! say @names>>.ucfirst; ## stampa : Linus Richard Larry Eric Ora, mettiamo di voler trovare chi di questi inizia per L : say @names>>.match(rx/:i ^l/); 4 Perl6 Dai nomi completamente casuali MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste map Le possibilità sono limitate solo dai metodi disponibili per il vostro tipo di dato; my @a = 0, pi/2, pi ... 4*pi; say @a>>.sin>>.abs; La sintassi è una semplificazione di quella del map : ## perl6 code say map { .sin.abs }, @a; ## perl5 code print map { abs(sin($_)) } @a; Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste Iper-facile Vediamo l’uso degli operatori puntuali, che in perl6 sono chiamati iperoperatori: my @names = <Linus Larry>; my @surnames = <Torvalds Wall>; say (@names >>~<< @surnames); # stampa LinusTorvalds LarryWall E un esempio numerico: my @n = 1..5; say (@n <<*>> @n); # stampa i quadrati : 1,4,9,16,25 5 5 Perl6 La differenza tra «» e »« c’è solo per array di lunghezza diversa MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste ZeX Il metaoperatore Z ha lo stesso effetto dei precedenti, cioè scrivere Z* è esattamente uguale a »*« Però, Z può essere usato anche da solo, ad esempio : for @a Z @b -> $a, $b { ... } ## Itera su due array, in parallelo X invece genera il prodotto cartesiano dei due array : riprendiamo l’esempio dei nomi : say (@names X~ @surnames); ## Oltre ai nomi giusti, genera ## LinusWall e LarryTorvalds Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste Somme e prodotti Sommiamo i primi 100 numeri Nessun bisogno di algoritmi di Gauss6 o trucchi vari. say [+] 1..100; Calcoliamo il fattoriale! sub postfix:<!> { [*] 1..$^n }; say 6!; 6 Perl6 Non citato a caso MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste Operatori inattesi Si può usare anche con operatori meno “intuitivi” delle somme o dei prodotti; A proposito di algoritmi di Gauss, verifichiamo che l’idea alla base funziona. my @a = 1..100; my @b = 100,99 ... 1; say "Funziona!" if ([==] (@a >>+<< @b)); O come in questo caso, verifichiamo che le due liste siano già ordinate : say "Ordine crescente" if ([<=] @a); say "Ordine decrescente" if ([>=] @b); Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste Sequenze Magari pensate che nelle slide precedenti io abbia imbrogliato tagliando l’input : my @a = 0, pi/2, pi ... 4*pi; L’operatore ... riconosce invece le sequenze più comuni Con almeno due termini può riconoscere una successione aritmetica Con almeno tre termini una successione geometrica my @a = 2,4 ... 20; my @a = 1,3,9 ... 243; Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Divertirsi con le liste Giochiamo con le mie regole L’utente può specificare le regole con cui proseguire la successione : un’altro modo di specificare una successione decrescente a salti, ad esempio : my @a = 100, *-5 ... 0; Fino ad arrivare alla potente magia nera di questo esempio : my @fib = (1,1, *+* ... ^* > 1000000); Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Smart Perl Smart matching Un altro operatore degno di nota è ~~: say “cifra singola” if $var ~~ 0..9 Controlla se un numero è in un certo intervallo. say “match!” if $string ~~ m/ˆ\w+ $/ Esegue il match per espressione regolare. say “Frazione” if $var ~~ Rat Controlli sul tipo. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Smart Perl Sintassi diversa, stessa idea Abbiamo già introdotto il where : sub sqrt (Num $x where {* > 0}) { ... } subset integer of Rat where .denominator == 1; my $y = 5.Rat; say "ok" if $y ~~ integer Anche in questo caso, il meccanismo sottostante è quello dello smart matching. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Smart Perl Sveliamo il trucco perl controlla il metodo ACCEPTS per la classe giusta. Esempio : dipendenza lineare class Vector2 { has $.x1; has $.x2; method ACCEPTS(Vector2 $y) { return ($y.x1/$.x1 == $y.x2/$.x2); } } my $v1 = Vector2.new( x1 => 1, x2 => 1); my $v2 = Vector2.new( x1 => 5, x2 => 5); my $v3 = Vector2.new( x1 => 7, x2 => 5); say $v1 ~~ $v2; ## True say $v1 ~~ $v3; ## False Il potenziale per definire relazioni di equivalenza è ben chiaro. Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Varie Testo say (1..100).fmt("%03d", ",") # Stampa 001, 002 ... 010 ... 099, 100 # Già separati da virgole fmt unisce le funzionalità di printf . . . . . . a quelle di join e kv my $text = "1primo2secondo ... 10decimo ..."; my @keys = $text.comb(rx/\d+/); my @values = $text.split(rx/\d+/); comb funziona allo stesso modo di split . . . . . . ma restituendo i separatori invece dei “separati” Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Varie Ci sarebbe molto altro . . . Si potrebbe parlare di molto altro, ad esempio . . . Il sort con comparatori definiti dall’utente esegue automaticamente una Schwartzian transform quando può Molto di più sugli asterischi magici, Whatever, . . . I nuovi e furbi randomizzatori per array Gli operatori pipe ==> Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Varie Fonti . . . ma per questo e ancora altro, vi consiglio di passare da http://www.perl6advent.wordpress.com Perl6 MontelLUG The Way of the Camel The Apocalypse OOP Demo Varie Letture consigliate per approfondire. . . Autori vari, Using Perl6 Moritz Lenz Perl5 to 67 Online http://www.perl6.org http://perl6advent.wordpress.com http://www.rakudo.org http://try.rakudo.org 7 Perl6 http://perlgeek.de/en/article/5-to-6 – un po’ datato MontelLUG The Way of the Camel The Apocalypse OOP Demo Varie Grazie per l’attenzione Domande? Perl6 MontelLUG