Perl:
programmazione postmoderna
e filosofia opensource
----
Michele Beltrame
----
Perl.It
----
Perl
----
NASA
1987
----
Larry Wall
----
TMTOWTDI
regular expression
obfuscation
one-liner
multipiattaforma
Perl 6 arriverà
----
/^\d+(?:\.\d+)?$/
----
Bello ma...
----
Old
----
Modern Perl
----
TMTOWTDI ma...
object oriented programming
autobox
programmazione funzionale
CPAN
Perl 5 è qui, Perl 6 arriverà
community
----
*** 1 ***
TMTOWTDI ma..
----
Larry Wall:
linguista
----
più modi per esprimere lo stesso concetto
----
Se esco ti porto con me
Ti porto con me se esco
Ti porto con me se non resto a casa
----
più modi per scrivere analogo codice
----
# così...
if ( $lady eq 'Macbeth' ) {
say 'Shakespeare girl';
}
# o così...
say 'Shakespeare girl'
if $lady eq 'Macbeth';
# o così...
say 'Shakespeare girl'
unless $lady ne 'Macbeth';
----
# OOP così...
package Cane;
use parent qw/Animale Peloso/;
sub new($self, $args) {
$self->{altezza} = $args->{altezza};
}
----
# ...o così
package Cane;
use Class::Std;
use parent qw/Animale Peloso/;
my %altezza;
sub BUILD($self, $objID, $args) {
$altezza{$objID} = $args->{altezza};
}
----
Espressività
----
Confusione
----
Recommended Way To Do It
----
!=
Only Way To Do It
----
package Cane;
use Moose;
extends 'Animale';
with 'Peloso';
has 'altezza'
=> { isa => 'Num', is => 'rw' }
----
Zucchero sintattico
----
class Cane
extends 'Animale'
with 'Peloso' {
has 'altezza'
=> { isa => 'Num', is => 'rw' }
}
----
*** 2 ***
Object Oriented Programming
----
Moose
----
class Animale {
has 'altezza'
=> ( isa => 'Num', is => 'rw' );
method vai(Str $luogo) {
say "vado $luogo";
}
}
----
my $animale = Animale->new({
altezza => 50
});
say $animale->altezza;
# Eccezione
$animale->altezza('sessanta');
$animale->altezza(60);
----
* before
* after
----
class Cane
extends Animale {
has 'zampe' => (
isa => 'Num', is => 'rw', default => 4
);
after vai(Str $luogo) {
say 'sulle mie '
. $self->zampe . ' zampe';
}
}
----
my $cane = Cane->new();
$cane->vai('a cuccia');
vado a cuccia
sulle mie 4 zampe
----
* around
----
class Gatto
extends Animale {
around vai(Str $luogo) {
say 'invece';
$self->$orig('dove mi pare');
say 'perché sono un gatto';
}
}
----
$gatto->vai('divano');
invece
vado dove mi pare
perché sono un gatto
----
* override + super
* augment + inner
----
class Animale {
method rincasa() {
say 'torno ';
inner();
say ' e dormo';
}
}
----
class Gatto
extends Animale {
augment rincasa() {
say 'sul divano';
}
}
----
$gatto->rincasa();
torno
sul divano
e dormo
----
LISPy
----
* multimethods
----
class Lotta {
use MooseX::MultiMethods;
multi method v(Cane $p1, Gatto $p2) {
say 'p1'
}
multi method v(Gatto $p1, Cane $p2) {
say 'p2'
}
multi method v(Any $p1, Any $p2) {
say 'pari'
}
}
----
my $lotta = Lotta->new();
$lotta->v($cane, $gatto);
$lotta->v($gatto, $cane);
$lotta->v($cane, $cane);
p1
p2
pari
----
* roles
----
role Peloso {
has 'peli' => (
isa => 'Num', is => 'rw', default => 2**40
);
}
class Cane
extends Animale
with Peloso {
has 'zampe' => (
isa => 'Num', is => 'rw', default => 4
);
}
----
my $cane = Cane->new({ peli => 4 });
say $cane->peli;
4
----
Autobox
----
Metodi su tipi nativi
----
Ruby
----
say uc "Bambi è tra noi";
"Bambi è tra noi"->uc()->say();
"Bambi è tra noi"->uc->say;
----
"Testo"->metodo();
$stringa->metodo();
----
say 5->dec;
4
----
my $list = [4, 7, 23, 8];
my $sum = 0;
for my $elem (@$list) {
$sum += $elem;
}
say $sum;
----
say [4, 7, 23, 8]->sum;
[4, 7, 23, 8]->sum->say;
----
42
----
[4, 7, 23, 8]->foreach(sub {
say "Numero: $_[0]";
});
----
# Chaining
say " Separiamo con virgole "
->strip
->split(qr/\s+/)
->join(',');
Separiamo,con,virgole
----
*** 3 ***
Programmazione Funzionale
----
Haskell
----
* map, grep
----
my @numeri = (3, 4, 24, 7);
my @plus_10 = map { $_ + 10 } @numeri;
my @pari = grep { !($_ % 2) } @numeri;
----
* closure
----
my $factory = sub {
my $enclosed = 5;
return sub {
return shift() + $enclosed;
};
};
my $sum5 = $factory->();
my $nine = $sum_5->(4);
----
* operatori o... funzioni
----
# 4+1 o 4++
my $cinque = inc 4;
# $cinque*2
my $dieci = double $cinque;
# $cinque*$cinque
my $v5 = square $cinque;
----
* folding
----
my $sommal = foldl { shift() + shift() } 0, [1..10];
my $sommar = foldr { shift() + shift() } 0, [1..10];
55
55
----
foldl :: (a -> b -> a) -> a -> [b] -> a
foldl f z [] = z
foldl f z (x:xs) = foldl f (f z x) xs
foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
----
* liste
----
my $solo_4 = take 4, [qw/3 5 2 8 9 23/];
my $ultimi = drop 4, [qw/3 5 2 8 9 23/];
my $div = span { shift() < 5 } [qw/3 5 2 8 9 23/];
my $div_1 = zip $div;
[ 3, 5, 2, 8 ]
[ 9, 23 ]
[ [3, 2], [5, 8, 9, 23] ]
[ 3, 2, 5, 8, 9, 23 ]
----
* liste infinite
----
my $primi_8 = take(8, iterate { shift() * 2 } 1);
my $sempre_8 = take(8, repeat(42));
[1, 2, 4, 8, 16, 32, 64, 128]
[42, 42, 42, 42, 42, 42, 42, 42]
----
* testo
----
my $parole = words 'il barone rosso';
my $frase = unwords $parole;
['il', 'barone', 'rosso']
'il barone rosso'
----
unwords :: [String] -> String
unwords [] = []
unwords ws = foldr1 (\w s -> w ++ ' ':s) ws
----
* currying (Sub::Curried)
----
my $saluta = curry($saluto, $nome) {
say "$saluto, $nome";
};
my $buongiorno = $saluta->('buongiorno');
$saluta->('buonasera', 'Charles');
$buongiorno->('Hakim');
$buongiorno->('Michele');
----
* composing (Sub::Compose)
----
my $to_celsius = sub {
return shift() - 32;
};
my $to_kelvin = sub {
return shift() + 459.67;
};
my $from_fahrenheit = sub {
return shift() / 1.8;
};
my $f2c = compose( $to_celsius, $from_fahrenheit );
my $f2k = compose( $to_kelvin, $from_fahrenheit );
----
say $f2c->(212);
say $f2k->(212);
100
373.15
----
Non tutto è parte del linguaggio
----
ma
----
Perl è estensibile
----
perl è estensibile
----
Devel::Declare
possiamo programmare il parser
----
quanto mostrato già esiste
----
e funziona
----
bene
----
*** 4 ***
CPAN
----
oltre 18000 moduli
----
Unix è l'ambiente di sviluppo
Perl è la virtual machine
CPAN è il linguaggio
----
Matt Trout
----
un po' matto
----
Catalyst
----
framework MVC
----
Ruby on Rails
----
* solo dispatcher + I/O
* modelli: moduli CPAN
* DB: DBIx::Class, Rose::DB::Object, ...
* viste: moduli CPAN
* Templating: TT, Mason, ...
* decine di base controller (form, ...)
* decine di plugin (autenticazione, I18N, ...)
----
DBIx::Class
----
* Object-Relational Mapper
* resultset-oriented
* astrazione SQL (join, where, subquery, ...)
* caching, prefetching, ...
* transazioni esprimibili via closure
* facilmente estensibile
----
Il Perl che ricordo non è così
----
Quanta roba devo installare
per avere tutto ciò?
----
90%
Task::Kensho
----
il resto è su CPAN
----
Sempre su CPAN
* interfacciamento a database
* FTP, POP3, SSH, SMTP, IRC, ...
* astrazione filesystem, database
* web (template, tag clouds, CAPTCHA, ...)
* ricerche automatiche su engine
* import/export Excel, CSV, PDF, ...
* interfacce grafiche (Gtk, ...)
* generazione di parser da grammatiche
* ritocco immagini, generazione barcode, ...
* [tutto l'immaginabile + il demenziale]
----
*** 5 ***
Perl 5 è qui
Perl 6 arriverà
----
Perl 6:
annunciato nel 2000
----
Perl 5:
rallentamento sviluppo
----
Perl 6:
arriva quando arriva
----
Perl 5:
prendiamo qualcosa da Perl 6
----
Perl 5:
e sviluppiamo anche altro
----
Perl 5 != Perl 6
----
Rinascita
----
Immigrazione
----
Ritorno di emigrati
----
Perl 6:
arriverà a primavera 2010
----
*** 6 ***
Community
----
irc.perl.org
----
PerlMonks.com
----
Community che invoglia a
dare il proprio contributo
----
Non sei bravo abbastanza
----
Nessuno lo è
----
Tutti possono contribuire
----
* Testing
* Bug reporting
* Documentazione
* Traduzioni
* Programmazione
----
Caffeina
Notti di luna piena
Capelli lunghi (o barba)
----
Git
----
o Subversion a volte
----
git branch
----
fai tutti gli errori che vuoi...
----
...senza che nessuno lo sappia
----
mai
----
Community Italiana
----
www.perl.it
----
da 10 anni
----
punto di aggregazione
della community italiana
----
documentazione
* corsi
* articoli
* recensioni
* blog
----
pod2it
traduzione documentazione ufficiale
----
mailing list
----
chat
----
utile
!('perdita di tempo')
----
a volte
----
Nordest.pm
----
come minimo...
...due pranzi all'anno
----
PerlHike
----
PerlSki?
----
Associazione Perl.it
----
Italian Perl Workshop
----
YAPC::EU 2010
----
Pisa
Agosto 2010
----
4-6
probabilmente
----
Grazie ai nostri soci e sponsor
----
* Eventi sempre migliori
* Più ospiti
* Più caffé e pasticcini
* Anche nel Nordest (?)
----
Grazie ai nostri volontari
----
* Documentazione/articoli
* Gestione server e sito
* Traduzioni per pod2it
* Organizzazione eventi
----
Trovi Perl interessante?
----
O divertente?
----
www.perl.it
www.perl.org
----
Grazie!