SlideShare uma empresa Scribd logo
1 de 74
Corinna Status
Update
Modern OOP is coming to Perl
Curtis “Ovid” Poe
https://allaroundtheworld.fr/
https://ovid.github.io/
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Question Policy
• Please hold them to the end
• Unless something is completely incomprehensible
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Dedication
David
Adler Jeff Goff
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Sparky
What is Corinna?
https://github.com/Ovid/Cor
(This talk is not a tutorial on Corinna)
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
The Lisp
Curse
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
The Lisp
Perl Curse
(edited)
Since making Perl object systems is not
hard, many Perl hackers have done so.
More to the point, many individual Perl
hackers have done so. Programs written
by individual hackers tend to follow the
scratch-an-itch model. These programs
will solve the problem that the hacker is
having without necessarily making the
software more useful to others. This
means that these one-man-band
projects tend to solve eighty-percent of
the problem.
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Core
OOP
(Today)
• bless
• @ISA
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Core
OOP
(Today)
• bless–We have methods!
• @ISA–Where are the methods?
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Core
OOP
(Today)
• bless–We have methods subroutines!
• @ISA–Where are the methods subroutines?
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Core
OOP
(Today)
package Name;
sub new {
my ( $class, %arg_for ) = @_;
return bless {
name => $arg_for{name},
title => $arg_for{title},
}, $class;
}
sub _title { $_[0]->{tilte} }
sub _name { $_[0]->{name} }
sub name {
my $self = shift;
my $title = $self->_title;
my $name = $self->_name;
return $title ? "$title $name"
: $name;
}
1;
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Core
OOP
(Today)
my $ovid = Name->new( name => 'Ovid' );
my $doctor = Name->new(
title => 'Dr.',
name => 'Who',
);
say $ovid->name; # Ovid
say $doctor->name; # Dr. Who
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Core
OOP
(Today)
package Name;
sub new {
my ( $class, %arg_for ) = @_;
return bless {
name => $arg_for{name},
title => $arg_for{title},
}, $class;
}
sub _title { $_[0]->{tilte} }
sub _name { $_[0]->{name} }
sub name {
my $self = shift;
my $title = $self->_title;
my $name = $self->_name;
return $title ? "$title $name"
: $name;
}
1;
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Corinna
class Name {
field $name :param;
field $title :param { undef };
method name () {
return $title ? "$title $name" : $name;
}
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Core
OOPS
package Name;
sub new {
my ( $class, %arg_for ) = @_;
return bless {
name => $arg_for{name},
title => $arg_for{title},
}, $class;
}
sub _title { $_[0]->{tilte} }
sub _name { $_[0]->{name} }
sub name {
my $self = shift;
my $title = $self->_title;
my $name = $self->_name;
return $title ? "$title $name"
: $name;
}
1;
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Corinna
class Name {
field $name :param;
field $title :param { undef };
method name () {
return $Title ? "$tilte $name" : $name;
}
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
80+ OOP
systems
on the
CPAN
Mo
Mu
Mic
Moo
Mew
Dios
Moose
Moops
Moxie
reform
Spiffy
Zydeco
HO::Class
Class::LOP
Evo::Class
Class::Dot
Class::Ref
Class::Std
Mojo::Base
Eixo::Base
Class::Root
Class::Easy
Class::Core
Class::Base
Class::Lite
Class::Lego
Class::GAPI
Class::Slot
Class::Tiny
Class::Gomor
Class::Field
Rose::Object
Class::Maker
Class::HPLOO
Class::Frame
Class::Class
Class::Simple
Class::Attrib
Class::Closure
Class::Methods
Class::Builder
Class::Declare
Class::Accessor
Class::Contract
Class::Generate
Class::InsideOut
Acme::Class::Std
Class::Anonymous
Class::Classless
Class::Std::Fast
Class::Framework
Class::Autoclass
Class::Methodist
Bubblegum::Class
Object::LocalVars
Object::InsideOut
Class::AutoAccess
Class::Prototyped
Class::Structured
Class::NamedParms
Class::Constructor
AI::FreeHAL::Class
Class::BuildMethods
Lexical::Attributes
Class::AccessorMaker
Class::IntrospectionMe
thods
Class::MakeMethods::Te
mplate::InsideOut
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Dios
Damian
Conway
class Identity is Trackable {
shared Num %!allocated_IDs;
shared Num $.prev_ID is rw;
func _allocate_ID() {
while (1) {
lex Num $ID = rand;
return $prev_ID =$ID if !$allocated_IDs{$ID}++;
}
}
has Num $.ID = _allocate_ID();
has Str $.name //= '<anonymous>';
has Passwd $!passwd;
method identify (Str $pwd --> Str) {
return "$name [$ID]" if $pwd eq $passwd;
}
submethod DESTROY {
say "Bye, $name!";
}
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Zydeco
Toby Inkster
class Person {
has name ( type => Str, required => true );
has gender ( type => Str );
factory new_man (Str $name) {
return $class->new(name => $name, gender => 'male');
}
factory new_woman (Str $name) {
return $class->new(name => $name, gender => 'female');
}
method greet (Person *friend, Str *greeting = "Hello") {
printf("%s, %s!n", $arg->greeting, $arg->friend->name);
}
coerce from Str via from_string {
return $class->new(name => $_);
}
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Why do they stand out?
They didn’t limit themselves to what Perl can do today
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Corinna
The Corinna
Team
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
field $created :reader { time };
method set ( $key, $value ) {
if ( $cache->exists($key) ) {
$cache->delete($key);
}
elsif ( $cache->keys > $max_size ) {
$cache->shift;
}
$cache->set( $key, $value ); # add to front
}
method get ($key) {
if ( $cache>exists($key) ) {
my $value = $cache->get($key);
$self->set( $key, $value ); # add to front
return $value;
}
return;
}
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
How Did We Get Here?
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Ovid’s
Sponsor
• All Around the World
• https://allaroundtheworld.fr/
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Paul Evans’
Sponsors
Sponsor Amount
Oetiker+Partner
AG
1000 CFH
Perl-Verein
Schweiz
3000 CHF
Deriv Ongoing
Anonymous …
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Corinna Team/Influencers/Contributors
(Incomplete list by first name)
• Curtis “Ovid” Poe
• Damian Conway
• Dan Book (Grinnz)
• Graham Knop (haarg)
• Harald Jörg
• Matt Trout
• Paul Evans
• Sawyer X
• Stevan Little
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
History
• March 2006: Stevan Little releases Moose 0.1
• March 2010: Stevan Little releases Moose 1.0
• June 2017: Stevan releases Moxie
• June 2019: Ovid starts working on Corinna (née Cor)
• August 2019: Riga Perl Conference. Sawyer X blows my mind
• October 2019: First public announcement of Corinna
• October 2019: Paul Evans starts work on Object::Pad test bed
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Moxie
package Point {
use Moxie;
extends 'Moxie::Object';
has x => ( default => sub { 0 } );
has y => ( default => sub { 0 } );
sub x : ro;
sub y : ro;
sub clear ($self) {
$self->@{ 'x', 'y' } = (0, 0);
}
}
30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
Corinna
class Point {
field ( $x, $y ) :param :reader {0};
method clear () { $x = 0; $y = 0; }
}
30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
Pre-History
• Based on Keyword::Declare
• Implementation + Test Suite
• Influenced by Moxie ideals
• Heavily reflected Moose heritage
• Lost when a pipe burst in our house
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Sawyer X Arrives
• 2019 Riga Perl Conference
• Sawyer X tells me to ditch the implementation
• “Design something great.”
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Early
Work
Ovid
class Cache::LRU {
use Hash::Ordered;
has cache => (default => sub { Hash::Ordered->new });
has max_size => (default => sub { 20 });
method set ( $key, $value ) {
if ( self->cache->exists($key) ) {
self->cache->delete($key);
}
elsif ( self->cache->keys > self->max_size ) {
self->cache->shift;
}
self->cache->set( $key, $value );
}
method get ($key) {
if ( self->cache->exists($key) ) {
my $value = self->cache->get($key);
self->set( $key, $value ); # add to front
return $value;
}
return;
}
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Features
• Cleaner syntax
• self as a keyword
• Methods and subroutines are no longer the same thing
• Encapsulation by default (but my design was bad)
• No declarative way to expose state (another design flaw)
• Lexical variables for state were considered (but I considered them
“unperlish”)
• Paul “LeoNerd” Evans argued for lexical variables for state (he was
right)
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Corinna
The Corinna
Team
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
method set ( $key, $value ) {
if ( $cache->exists($key) ) {
$cache->delete($key);
}
elsif ( $cache->keys > $max_size ) {
$cache->shift;
}
$cache->set( $key, $value ); # add to front
}
method get ($key) {
if ( $cache>exists($key) ) {
my $value = $cache->get($key);
$self->set( $key, $value ); # add to front
return $value;
}
return;
}
} 30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Moose
Damnit,
Stevan
package Cache::LRU {
use Moose;
use Hash::Ordered;
use namespace::autoclean;
has '_cache' => (
is => 'ro',
init_arg => undef,
default => sub { Hash::Ordered->new },
);
has 'max_size' => ( is => 'ro', default => 20 );
sub set {
my ( $self, $key, $value ) = @_;
if ( $self->_cache->exists($key) ) {
$self->_cache->delete($key);
}
elsif ( $self->_cache->keys >= $self->max_size ) {
$self->_cache->shift;
}
$self->_cache->set( $key, $value );
}
sub get {
my ( $self, $key ) = @_;
$self->_cache->get($key)
if ( $self->_cache>exists($key) ) {
my $value = $self->_cache->get($key);
$self->set( $key, $value ); # add to front
return $value;
}
}
__PACKAGE__->meta->make_immutable;
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Objections
1. bless is good enough for me
2. Moo/se won. It should be in core
3. Same ideas, different syntax
4. How can I debug encapsulated objects?
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
1. bless is good enough for
me
• We’re not removing bless.
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
2. Moo/se won. It should be in
core
• A popular minority view
• They're great, mature modules, but …
• The authors, Stevan Little (Moose) and Matt Trout (Moo) aren’t arguing
for this
• P5P doesn’t want them
• They’re hobbled by the current limitations of Perl
See also: https://ovid.github.io/articles/why-is-perl-not-putting-
moose-in-the-core.html
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Current Limitations of Perl
• Methods are subroutines
• Classes are packages
• No native state
• No native encapsulation
• No native delegation
• No differentiation between class methods and instance methods
• Classes are not “first-class” types
• … and on and on and on
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
3. Same ideas,
different syntax
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
3. Same
ideas,
different
syntax
• We’ve been explaining the difference for years
• It’s hard to keep explaining, so you point them to
the RFC
• But this is really important, so here goes…
30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
Background
• Based on decades of personal OOP experience
• Supported by Stevan Little (creator of Moose)
• Supported by Matt Trout (creator of Moo)
• Supported by Damian Conway (designer of Raku and SPEC OOP
systems)
• Ideas from far too many books, papers, and articles on OOP and
type systems
• Designed to create a “Perlish” OOP system
• Subject to two DMCA takedown notices from an OnlyFans “artist” 30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
237th time’s the
charm!
3. Same ideas, different syntax
Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
Chris “Peregrin” Prather to P5P
• Class composition: “Design Patterns: Elements of Reusable Object-
Oriented Software”, published literally 4 days after Perl 5.000 says
to prefer composition to inheritance.
• Perl’s only native solution to reusable behavior is inheritance.
• Perl has no native solution to encapsulation (there are complex
workarounds)
Source: https://markmail.org/message/pxmkevqe7qg7tld2, June
19, 2021
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Native
composition
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
method set ( $key, $value ) {
if ( $cache->exists($key) ) {
$cache->delete($key);
}
elsif ( $cache->keys > $max_size ) {
$cache->shift;
}
$cache->set( $key, $value );
}
…
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Native state
and
composition
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
method set ( $key, $value ) {
if ( $cache->exists($key) ) {
$cache->delete($key);
}
elsif ( $cache->keys > $max_size ) {
$cache->shift;
}
$cache->set( $key, $value );
}
…
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Native state,
encapsulation
, and
composition
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
method set ( $key, $value ) {
if ( $cache->exists($key) ) {
$cache->delete($key);
}
elsif ( $cache->keys > $max_size ) {
$cache->shift;
}
$cache->set( $key, $value );
}
…
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Runtime
failures
package Cache::LRU {
use Moose;
use Hash::Ordered;
has '_cache' => (
is => 'ro',
init_arg => undef,
default => sub {Hash::Ordered->new},
);
has 'max_size' => (
is => 'ro',
default => 20,
);
sub set ( $self, $key, $value ) {
if ($self->_cahce->exists($key)) {
$self->_cache->delete($key);
}
…
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Become
Compile-time
failures
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
method set ( $key, $value ) {
if ( $cach->exists($key) ) {
$cache->delete($key);
}
elsif ( $cache->keys > $max_size ) {
$cache->shift;
}
$cache->set( $key, $value );
}
…
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Fields no
longer
exposed
by
default.
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
…
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
init_arg
=> undef
no longer
needed
class Cache::LRU :version(v0.1.0) {
use Hash::Ordered;
field $cache { Hash::Ordered->new };
field $max_size :param :reader { 20 };
…
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Methods
are not
subs
class Some::Class :version(v0.1.0) {
use Some::Module 'set';
method set ( $key, $value ) {
if ( set( … ) ) {
# subroutine called, not the method
}
…
}
…
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Methods
are not
subs
This might not make to the 1st
version.
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
4. Debugging encapsulated
objects
• The MOP will allow encapsulation violation
• It will be harder to do
• Violating encapsulation becomes the last choice, not the first
• Data::Printer, Data::Dumper, the debugger, and other tools
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Corinna is Simple!
Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
Four Little Words
• class
• role
• field
• method
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
blogs.perl.org
• A dream realized
• A dream resyntaxed
• A (not so) simple matter of privacy
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
use feature "class";
• perldoc -f class
• perldoc -f role
• perldoc -f field
• perldoc -f method
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Modifiers
• class My::Class :isa(Other::Class)
• role My::Role :does(Other::Role)
• field $name :param :reader
• method frobnicate :common
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
January 16, 2022
Corinna RFC Accepted
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Accepted with Caveats
• Corinna was not completely accepted
• Smaller, easier to test features, one at a time
• A Minimally Minimum Viable Product (MMVP)
Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
Who?
• Paul Evans—LeoNerd
• Object::Pad
• Future::AsyncAwait
• Syntax::Keyword::Try
• Much more
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
The MMVP Steps
1. Classes
2. Inheritance
3. Roles
4. Field modifiers
5. Field initializer blocks
6. Meta-Object Protocol (MOP)
7. Method modifiers
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Perl Steering Council Meeting 2022-03-11
“Paul let us know that he’s now got a sponsor to cover his
initial Corinna implementation work, and his plan is to
land the first stage at the start of the 5.37 dev cycle.”
https://www.nntp.perl.org/group/perl.perl5.porters/2022/03/msg263374.html
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Timefram
e
30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
None
Almost three years of design
(based on years of prototypes)
Make it right, not make it now
Questions?
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
TYPES?
Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
Corinna +
Types!
• Early work had types
• Everybody wants them
• All of the designers said “no”
30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
The Problem
with Types
• Variable declarations
• Field declarations
• Subroutine arguments
• Method arguments
• Casting
• … and more ???
Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
The Problem
with Types
• Built-in Types?
• Int, Float, Char, etc.
• User-defined Types?
• Classes
• Subtypes
Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
NO TYPES 😢
Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
But …
Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
IMMUTABLE
OBJECTS
Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
class Name {
field $name :param;
field $title :param { undef };
method name () {
return $title ? "$title $name" : $name;
}
}
30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
Type Library
package Our::Types {
use Less::Boilerplate;
use Type::Library -base;
use Type::Utils -all;
use Type::Params;
our @EXPORT_OK;
BEGIN {
extends qw(
Types::Standard
Types::Common::Numeric
Types::Common::String
);
push @EXPORT_OK => qw/compile compile_named/;
}
}
1;
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/
Corinna +
Types
class Name {
use Our::Types qw(NonEmptyStr Maybe compile);
field $name :param;
field $title :param { undef };
ADJUST {
state $check = compile(NonEmptyStr,Maybe[NonEmptyStr]);
$check->( $name, $title );
}
method name () {
return $title ? "$title $name" : $name;
}
}
30 mars 2022
Copyright 2022, http://www.allaroundtheworld.fr/

Mais conteúdo relacionado

Mais procurados

Reactive Web - Servlet & Async, Non-blocking I/O
Reactive Web - Servlet & Async, Non-blocking I/OReactive Web - Servlet & Async, Non-blocking I/O
Reactive Web - Servlet & Async, Non-blocking I/OArawn Park
 
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin	Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin Vietnam Open Infrastructure User Group
 
Feline Lower Urinary Tract Disease
Feline Lower Urinary Tract DiseaseFeline Lower Urinary Tract Disease
Feline Lower Urinary Tract DiseaseRobert Gracia
 
Service Workers and APEX
Service Workers and APEXService Workers and APEX
Service Workers and APEXDimitri Gielis
 
Vault - Secret and Key Management
Vault - Secret and Key ManagementVault - Secret and Key Management
Vault - Secret and Key ManagementAnthony Ikeda
 
Introduction to Rust language programming
Introduction to Rust language programmingIntroduction to Rust language programming
Introduction to Rust language programmingRodolfo Finochietti
 
HAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİ
HAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİHAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİ
HAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİCOSKUN CAN AKTAN
 
Diseases of skin - Veterinary Dermatology
Diseases of skin - Veterinary DermatologyDiseases of skin - Veterinary Dermatology
Diseases of skin - Veterinary DermatologyAjith Y
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具Shengyou Fan
 

Mais procurados (10)

Kubernetes Introduction
Kubernetes IntroductionKubernetes Introduction
Kubernetes Introduction
 
Reactive Web - Servlet & Async, Non-blocking I/O
Reactive Web - Servlet & Async, Non-blocking I/OReactive Web - Servlet & Async, Non-blocking I/O
Reactive Web - Servlet & Async, Non-blocking I/O
 
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin	Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
Kata Container - The Security of VM and The Speed of Container | Yuntong Jin
 
Feline Lower Urinary Tract Disease
Feline Lower Urinary Tract DiseaseFeline Lower Urinary Tract Disease
Feline Lower Urinary Tract Disease
 
Service Workers and APEX
Service Workers and APEXService Workers and APEX
Service Workers and APEX
 
Vault - Secret and Key Management
Vault - Secret and Key ManagementVault - Secret and Key Management
Vault - Secret and Key Management
 
Introduction to Rust language programming
Introduction to Rust language programmingIntroduction to Rust language programming
Introduction to Rust language programming
 
HAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİ
HAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİHAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİ
HAYEK'İN ALTIN PARA SİSTEMİ ÜZERİNE DÜŞÜNCELERİ
 
Diseases of skin - Veterinary Dermatology
Diseases of skin - Veterinary DermatologyDiseases of skin - Veterinary Dermatology
Diseases of skin - Veterinary Dermatology
 
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
[COSCUP 2022] 讓黑畫面再次偉大 - 用 PHP 寫 CLI 工具
 

Semelhante a Corinna Status 2022.pptx

Rummaging in the clOOset
Rummaging in the clOOsetRummaging in the clOOset
Rummaging in the clOOsetCurtis Poe
 
2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL Spartakiade2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL SpartakiadeJohannes Hoppe
 
Ten modules I haven't yet talked about
Ten modules I haven't yet talked aboutTen modules I haven't yet talked about
Ten modules I haven't yet talked aboutacme
 
Midgard2 - Content Repository for mobile applications
Midgard2 - Content Repository for mobile applicationsMidgard2 - Content Repository for mobile applications
Midgard2 - Content Repository for mobile applicationsHenri Bergius
 
コードの動的生成のお話
コードの動的生成のお話コードの動的生成のお話
コードの動的生成のお話鉄次 尾形
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony TechniquesKris Wallsmith
 
Introducing CakeEntity
Introducing CakeEntityIntroducing CakeEntity
Introducing CakeEntityBasuke Suzuki
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebMikel Torres Ugarte
 
Version Control with Puppet
Version Control with PuppetVersion Control with Puppet
Version Control with PuppetPuppet
 
PuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with PuppetPuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with PuppetWalter Heck
 
PuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with PuppetPuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with PuppetOlinData
 
Schema design short
Schema design shortSchema design short
Schema design shortMongoDB
 
Configuration Surgery with Augeas
Configuration Surgery with AugeasConfiguration Surgery with Augeas
Configuration Surgery with AugeasPuppet
 
Mysqlnd Async Ipc2008
Mysqlnd Async Ipc2008Mysqlnd Async Ipc2008
Mysqlnd Async Ipc2008Ulf Wendel
 
Corinna-2023.pptx
Corinna-2023.pptxCorinna-2023.pptx
Corinna-2023.pptxCurtis Poe
 

Semelhante a Corinna Status 2022.pptx (20)

Rummaging in the clOOset
Rummaging in the clOOsetRummaging in the clOOset
Rummaging in the clOOset
 
2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL Spartakiade2013-03-23 - NoSQL Spartakiade
2013-03-23 - NoSQL Spartakiade
 
Perl object ?
Perl object ?Perl object ?
Perl object ?
 
Ten modules I haven't yet talked about
Ten modules I haven't yet talked aboutTen modules I haven't yet talked about
Ten modules I haven't yet talked about
 
Midgard2 - Content Repository for mobile applications
Midgard2 - Content Repository for mobile applicationsMidgard2 - Content Repository for mobile applications
Midgard2 - Content Repository for mobile applications
 
コードの動的生成のお話
コードの動的生成のお話コードの動的生成のお話
コードの動的生成のお話
 
Os Davis
Os DavisOs Davis
Os Davis
 
jQuery Loves You
jQuery Loves YoujQuery Loves You
jQuery Loves You
 
Advanced symfony Techniques
Advanced symfony TechniquesAdvanced symfony Techniques
Advanced symfony Techniques
 
Introducing CakeEntity
Introducing CakeEntityIntroducing CakeEntity
Introducing CakeEntity
 
Charla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo WebCharla EHU Noviembre 2014 - Desarrollo Web
Charla EHU Noviembre 2014 - Desarrollo Web
 
Version Control with Puppet
Version Control with PuppetVersion Control with Puppet
Version Control with Puppet
 
PuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with PuppetPuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with Puppet
 
PuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with PuppetPuppetCamp SEA 1 - Version Control with Puppet
PuppetCamp SEA 1 - Version Control with Puppet
 
Lithium Best
Lithium Best Lithium Best
Lithium Best
 
Schema design short
Schema design shortSchema design short
Schema design short
 
Configuration Surgery with Augeas
Configuration Surgery with AugeasConfiguration Surgery with Augeas
Configuration Surgery with Augeas
 
Augeas @RMLL 2012
Augeas @RMLL 2012Augeas @RMLL 2012
Augeas @RMLL 2012
 
Mysqlnd Async Ipc2008
Mysqlnd Async Ipc2008Mysqlnd Async Ipc2008
Mysqlnd Async Ipc2008
 
Corinna-2023.pptx
Corinna-2023.pptxCorinna-2023.pptx
Corinna-2023.pptx
 

Mais de Curtis Poe

How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
life-off-earth.pptx
life-off-earth.pptxlife-off-earth.pptx
life-off-earth.pptxCurtis Poe
 
Rescuing a-legacy-codebase
Rescuing a-legacy-codebaseRescuing a-legacy-codebase
Rescuing a-legacy-codebaseCurtis Poe
 
Perl 6 For Mere Mortals
Perl 6 For Mere MortalsPerl 6 For Mere Mortals
Perl 6 For Mere MortalsCurtis Poe
 
Disappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, KeynoteDisappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, KeynoteCurtis Poe
 
How to Fake a Database Design
How to Fake a Database DesignHow to Fake a Database Design
How to Fake a Database DesignCurtis Poe
 
Are Managers An Endangered Species?
Are Managers An Endangered Species?Are Managers An Endangered Species?
Are Managers An Endangered Species?Curtis Poe
 
The Lies We Tell About Software Testing
The Lies We Tell About Software TestingThe Lies We Tell About Software Testing
The Lies We Tell About Software TestingCurtis Poe
 
A/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell youA/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell youCurtis Poe
 
Test::Class::Moose
Test::Class::MooseTest::Class::Moose
Test::Class::MooseCurtis Poe
 
A Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::ClassA Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::ClassCurtis Poe
 
Agile Companies Go P.O.P.
Agile Companies Go P.O.P.Agile Companies Go P.O.P.
Agile Companies Go P.O.P.Curtis Poe
 
Testing With Test::Class
Testing With Test::ClassTesting With Test::Class
Testing With Test::ClassCurtis Poe
 
Logic Progamming in Perl
Logic Progamming in PerlLogic Progamming in Perl
Logic Progamming in PerlCurtis Poe
 
Inheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth VersionInheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth VersionCurtis Poe
 
Inheritance Versus Roles
Inheritance Versus RolesInheritance Versus Roles
Inheritance Versus RolesCurtis Poe
 
Turbo Charged Test Suites
Turbo Charged Test SuitesTurbo Charged Test Suites
Turbo Charged Test SuitesCurtis Poe
 

Mais de Curtis Poe (18)

How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
life-off-earth.pptx
life-off-earth.pptxlife-off-earth.pptx
life-off-earth.pptx
 
Rescuing a-legacy-codebase
Rescuing a-legacy-codebaseRescuing a-legacy-codebase
Rescuing a-legacy-codebase
 
Perl 6 For Mere Mortals
Perl 6 For Mere MortalsPerl 6 For Mere Mortals
Perl 6 For Mere Mortals
 
Disappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, KeynoteDisappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
Disappearing Managers, YAPC::EU 2014, Bulgaria, Keynote
 
How to Fake a Database Design
How to Fake a Database DesignHow to Fake a Database Design
How to Fake a Database Design
 
Are Managers An Endangered Species?
Are Managers An Endangered Species?Are Managers An Endangered Species?
Are Managers An Endangered Species?
 
The Lies We Tell About Software Testing
The Lies We Tell About Software TestingThe Lies We Tell About Software Testing
The Lies We Tell About Software Testing
 
A/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell youA/B Testing - What your mother didn't tell you
A/B Testing - What your mother didn't tell you
 
Test::Class::Moose
Test::Class::MooseTest::Class::Moose
Test::Class::Moose
 
A Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::ClassA Whirlwind Tour of Test::Class
A Whirlwind Tour of Test::Class
 
Agile Companies Go P.O.P.
Agile Companies Go P.O.P.Agile Companies Go P.O.P.
Agile Companies Go P.O.P.
 
Econ101
Econ101Econ101
Econ101
 
Testing With Test::Class
Testing With Test::ClassTesting With Test::Class
Testing With Test::Class
 
Logic Progamming in Perl
Logic Progamming in PerlLogic Progamming in Perl
Logic Progamming in Perl
 
Inheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth VersionInheritance Versus Roles - The In-Depth Version
Inheritance Versus Roles - The In-Depth Version
 
Inheritance Versus Roles
Inheritance Versus RolesInheritance Versus Roles
Inheritance Versus Roles
 
Turbo Charged Test Suites
Turbo Charged Test SuitesTurbo Charged Test Suites
Turbo Charged Test Suites
 

Último

Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonAnna Loughnan Colquhoun
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfEnterprise Knowledge
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 

Último (20)

Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 

Corinna Status 2022.pptx

  • 1. Corinna Status Update Modern OOP is coming to Perl Curtis “Ovid” Poe https://allaroundtheworld.fr/ https://ovid.github.io/ 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 2. Question Policy • Please hold them to the end • Unless something is completely incomprehensible 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 3. Dedication David Adler Jeff Goff 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/ Sparky
  • 4. What is Corinna? https://github.com/Ovid/Cor (This talk is not a tutorial on Corinna) 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 5. The Lisp Curse 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 6. The Lisp Perl Curse (edited) Since making Perl object systems is not hard, many Perl hackers have done so. More to the point, many individual Perl hackers have done so. Programs written by individual hackers tend to follow the scratch-an-itch model. These programs will solve the problem that the hacker is having without necessarily making the software more useful to others. This means that these one-man-band projects tend to solve eighty-percent of the problem. 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 7. Perl Core OOP (Today) • bless • @ISA 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 8. Perl Core OOP (Today) • bless–We have methods! • @ISA–Where are the methods? 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 9. Perl Core OOP (Today) • bless–We have methods subroutines! • @ISA–Where are the methods subroutines? 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 10. Perl Core OOP (Today) package Name; sub new { my ( $class, %arg_for ) = @_; return bless { name => $arg_for{name}, title => $arg_for{title}, }, $class; } sub _title { $_[0]->{tilte} } sub _name { $_[0]->{name} } sub name { my $self = shift; my $title = $self->_title; my $name = $self->_name; return $title ? "$title $name" : $name; } 1; 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 11. Perl Core OOP (Today) my $ovid = Name->new( name => 'Ovid' ); my $doctor = Name->new( title => 'Dr.', name => 'Who', ); say $ovid->name; # Ovid say $doctor->name; # Dr. Who 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 12. Perl Core OOP (Today) package Name; sub new { my ( $class, %arg_for ) = @_; return bless { name => $arg_for{name}, title => $arg_for{title}, }, $class; } sub _title { $_[0]->{tilte} } sub _name { $_[0]->{name} } sub name { my $self = shift; my $title = $self->_title; my $name = $self->_name; return $title ? "$title $name" : $name; } 1; 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 13. Corinna class Name { field $name :param; field $title :param { undef }; method name () { return $title ? "$title $name" : $name; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 14. Perl Core OOPS package Name; sub new { my ( $class, %arg_for ) = @_; return bless { name => $arg_for{name}, title => $arg_for{title}, }, $class; } sub _title { $_[0]->{tilte} } sub _name { $_[0]->{name} } sub name { my $self = shift; my $title = $self->_title; my $name = $self->_name; return $title ? "$title $name" : $name; } 1; 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 15. Corinna class Name { field $name :param; field $title :param { undef }; method name () { return $Title ? "$tilte $name" : $name; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 16. 80+ OOP systems on the CPAN Mo Mu Mic Moo Mew Dios Moose Moops Moxie reform Spiffy Zydeco HO::Class Class::LOP Evo::Class Class::Dot Class::Ref Class::Std Mojo::Base Eixo::Base Class::Root Class::Easy Class::Core Class::Base Class::Lite Class::Lego Class::GAPI Class::Slot Class::Tiny Class::Gomor Class::Field Rose::Object Class::Maker Class::HPLOO Class::Frame Class::Class Class::Simple Class::Attrib Class::Closure Class::Methods Class::Builder Class::Declare Class::Accessor Class::Contract Class::Generate Class::InsideOut Acme::Class::Std Class::Anonymous Class::Classless Class::Std::Fast Class::Framework Class::Autoclass Class::Methodist Bubblegum::Class Object::LocalVars Object::InsideOut Class::AutoAccess Class::Prototyped Class::Structured Class::NamedParms Class::Constructor AI::FreeHAL::Class Class::BuildMethods Lexical::Attributes Class::AccessorMaker Class::IntrospectionMe thods Class::MakeMethods::Te mplate::InsideOut 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 17. Dios Damian Conway class Identity is Trackable { shared Num %!allocated_IDs; shared Num $.prev_ID is rw; func _allocate_ID() { while (1) { lex Num $ID = rand; return $prev_ID =$ID if !$allocated_IDs{$ID}++; } } has Num $.ID = _allocate_ID(); has Str $.name //= '<anonymous>'; has Passwd $!passwd; method identify (Str $pwd --> Str) { return "$name [$ID]" if $pwd eq $passwd; } submethod DESTROY { say "Bye, $name!"; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 18. Zydeco Toby Inkster class Person { has name ( type => Str, required => true ); has gender ( type => Str ); factory new_man (Str $name) { return $class->new(name => $name, gender => 'male'); } factory new_woman (Str $name) { return $class->new(name => $name, gender => 'female'); } method greet (Person *friend, Str *greeting = "Hello") { printf("%s, %s!n", $arg->greeting, $arg->friend->name); } coerce from Str via from_string { return $class->new(name => $_); } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 19. Why do they stand out? They didn’t limit themselves to what Perl can do today 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 20. Corinna The Corinna Team class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; field $created :reader { time }; method set ( $key, $value ) { if ( $cache->exists($key) ) { $cache->delete($key); } elsif ( $cache->keys > $max_size ) { $cache->shift; } $cache->set( $key, $value ); # add to front } method get ($key) { if ( $cache>exists($key) ) { my $value = $cache->get($key); $self->set( $key, $value ); # add to front return $value; } return; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 21. How Did We Get Here? 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 22. Ovid’s Sponsor • All Around the World • https://allaroundtheworld.fr/ 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 23. Paul Evans’ Sponsors Sponsor Amount Oetiker+Partner AG 1000 CFH Perl-Verein Schweiz 3000 CHF Deriv Ongoing Anonymous … 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 24. Corinna Team/Influencers/Contributors (Incomplete list by first name) • Curtis “Ovid” Poe • Damian Conway • Dan Book (Grinnz) • Graham Knop (haarg) • Harald Jörg • Matt Trout • Paul Evans • Sawyer X • Stevan Little 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 25. History • March 2006: Stevan Little releases Moose 0.1 • March 2010: Stevan Little releases Moose 1.0 • June 2017: Stevan releases Moxie • June 2019: Ovid starts working on Corinna (née Cor) • August 2019: Riga Perl Conference. Sawyer X blows my mind • October 2019: First public announcement of Corinna • October 2019: Paul Evans starts work on Object::Pad test bed 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 26. Moxie package Point { use Moxie; extends 'Moxie::Object'; has x => ( default => sub { 0 } ); has y => ( default => sub { 0 } ); sub x : ro; sub y : ro; sub clear ($self) { $self->@{ 'x', 'y' } = (0, 0); } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 27. Corinna class Point { field ( $x, $y ) :param :reader {0}; method clear () { $x = 0; $y = 0; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 28. Pre-History • Based on Keyword::Declare • Implementation + Test Suite • Influenced by Moxie ideals • Heavily reflected Moose heritage • Lost when a pipe burst in our house 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 29. Sawyer X Arrives • 2019 Riga Perl Conference • Sawyer X tells me to ditch the implementation • “Design something great.” 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 30. Early Work Ovid class Cache::LRU { use Hash::Ordered; has cache => (default => sub { Hash::Ordered->new }); has max_size => (default => sub { 20 }); method set ( $key, $value ) { if ( self->cache->exists($key) ) { self->cache->delete($key); } elsif ( self->cache->keys > self->max_size ) { self->cache->shift; } self->cache->set( $key, $value ); } method get ($key) { if ( self->cache->exists($key) ) { my $value = self->cache->get($key); self->set( $key, $value ); # add to front return $value; } return; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 31. Features • Cleaner syntax • self as a keyword • Methods and subroutines are no longer the same thing • Encapsulation by default (but my design was bad) • No declarative way to expose state (another design flaw) • Lexical variables for state were considered (but I considered them “unperlish”) • Paul “LeoNerd” Evans argued for lexical variables for state (he was right) 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 32. Corinna The Corinna Team class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; method set ( $key, $value ) { if ( $cache->exists($key) ) { $cache->delete($key); } elsif ( $cache->keys > $max_size ) { $cache->shift; } $cache->set( $key, $value ); # add to front } method get ($key) { if ( $cache>exists($key) ) { my $value = $cache->get($key); $self->set( $key, $value ); # add to front return $value; } return; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 33. Moose Damnit, Stevan package Cache::LRU { use Moose; use Hash::Ordered; use namespace::autoclean; has '_cache' => ( is => 'ro', init_arg => undef, default => sub { Hash::Ordered->new }, ); has 'max_size' => ( is => 'ro', default => 20 ); sub set { my ( $self, $key, $value ) = @_; if ( $self->_cache->exists($key) ) { $self->_cache->delete($key); } elsif ( $self->_cache->keys >= $self->max_size ) { $self->_cache->shift; } $self->_cache->set( $key, $value ); } sub get { my ( $self, $key ) = @_; $self->_cache->get($key) if ( $self->_cache>exists($key) ) { my $value = $self->_cache->get($key); $self->set( $key, $value ); # add to front return $value; } } __PACKAGE__->meta->make_immutable; } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 34. Objections 1. bless is good enough for me 2. Moo/se won. It should be in core 3. Same ideas, different syntax 4. How can I debug encapsulated objects? 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 35. 1. bless is good enough for me • We’re not removing bless. 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 36. 2. Moo/se won. It should be in core • A popular minority view • They're great, mature modules, but … • The authors, Stevan Little (Moose) and Matt Trout (Moo) aren’t arguing for this • P5P doesn’t want them • They’re hobbled by the current limitations of Perl See also: https://ovid.github.io/articles/why-is-perl-not-putting- moose-in-the-core.html 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 37. Current Limitations of Perl • Methods are subroutines • Classes are packages • No native state • No native encapsulation • No native delegation • No differentiation between class methods and instance methods • Classes are not “first-class” types • … and on and on and on 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 38. 3. Same ideas, different syntax 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 39. 3. Same ideas, different syntax • We’ve been explaining the difference for years • It’s hard to keep explaining, so you point them to the RFC • But this is really important, so here goes… 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 40. Background • Based on decades of personal OOP experience • Supported by Stevan Little (creator of Moose) • Supported by Matt Trout (creator of Moo) • Supported by Damian Conway (designer of Raku and SPEC OOP systems) • Ideas from far too many books, papers, and articles on OOP and type systems • Designed to create a “Perlish” OOP system • Subject to two DMCA takedown notices from an OnlyFans “artist” 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 41. 237th time’s the charm! 3. Same ideas, different syntax Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
  • 42. Chris “Peregrin” Prather to P5P • Class composition: “Design Patterns: Elements of Reusable Object- Oriented Software”, published literally 4 days after Perl 5.000 says to prefer composition to inheritance. • Perl’s only native solution to reusable behavior is inheritance. • Perl has no native solution to encapsulation (there are complex workarounds) Source: https://markmail.org/message/pxmkevqe7qg7tld2, June 19, 2021 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 43. Native composition class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; method set ( $key, $value ) { if ( $cache->exists($key) ) { $cache->delete($key); } elsif ( $cache->keys > $max_size ) { $cache->shift; } $cache->set( $key, $value ); } … 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 44. Native state and composition class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; method set ( $key, $value ) { if ( $cache->exists($key) ) { $cache->delete($key); } elsif ( $cache->keys > $max_size ) { $cache->shift; } $cache->set( $key, $value ); } … 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 45. Native state, encapsulation , and composition class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; method set ( $key, $value ) { if ( $cache->exists($key) ) { $cache->delete($key); } elsif ( $cache->keys > $max_size ) { $cache->shift; } $cache->set( $key, $value ); } … 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 46. Runtime failures package Cache::LRU { use Moose; use Hash::Ordered; has '_cache' => ( is => 'ro', init_arg => undef, default => sub {Hash::Ordered->new}, ); has 'max_size' => ( is => 'ro', default => 20, ); sub set ( $self, $key, $value ) { if ($self->_cahce->exists($key)) { $self->_cache->delete($key); } … 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 47. Become Compile-time failures class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; method set ( $key, $value ) { if ( $cach->exists($key) ) { $cache->delete($key); } elsif ( $cache->keys > $max_size ) { $cache->shift; } $cache->set( $key, $value ); } … 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 48. Fields no longer exposed by default. class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; … } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 49. init_arg => undef no longer needed class Cache::LRU :version(v0.1.0) { use Hash::Ordered; field $cache { Hash::Ordered->new }; field $max_size :param :reader { 20 }; … } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 50. Methods are not subs class Some::Class :version(v0.1.0) { use Some::Module 'set'; method set ( $key, $value ) { if ( set( … ) ) { # subroutine called, not the method } … } … } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 51. Methods are not subs This might not make to the 1st version. 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 52. 4. Debugging encapsulated objects • The MOP will allow encapsulation violation • It will be harder to do • Violating encapsulation becomes the last choice, not the first • Data::Printer, Data::Dumper, the debugger, and other tools 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 53. Corinna is Simple! Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
  • 54. Four Little Words • class • role • field • method 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 55. blogs.perl.org • A dream realized • A dream resyntaxed • A (not so) simple matter of privacy 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 56. use feature "class"; • perldoc -f class • perldoc -f role • perldoc -f field • perldoc -f method 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 57. Modifiers • class My::Class :isa(Other::Class) • role My::Role :does(Other::Role) • field $name :param :reader • method frobnicate :common 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 58. January 16, 2022 Corinna RFC Accepted 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 59. Accepted with Caveats • Corinna was not completely accepted • Smaller, easier to test features, one at a time • A Minimally Minimum Viable Product (MMVP) Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
  • 60. Who? • Paul Evans—LeoNerd • Object::Pad • Future::AsyncAwait • Syntax::Keyword::Try • Much more 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 61. The MMVP Steps 1. Classes 2. Inheritance 3. Roles 4. Field modifiers 5. Field initializer blocks 6. Meta-Object Protocol (MOP) 7. Method modifiers 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 62. Perl Steering Council Meeting 2022-03-11 “Paul let us know that he’s now got a sponsor to cover his initial Corinna implementation work, and his plan is to land the first stage at the start of the 5.37 dev cycle.” https://www.nntp.perl.org/group/perl.perl5.porters/2022/03/msg263374.html 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 63. Timefram e 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/ None Almost three years of design (based on years of prototypes) Make it right, not make it now
  • 64. Questions? 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 66. Corinna + Types! • Early work had types • Everybody wants them • All of the designers said “no” 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 67. The Problem with Types • Variable declarations • Field declarations • Subroutine arguments • Method arguments • Casting • … and more ??? Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
  • 68. The Problem with Types • Built-in Types? • Int, Float, Char, etc. • User-defined Types? • Classes • Subtypes Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
  • 69. NO TYPES 😢 Copyright 2022, http://www.allaroundtheworld.fr/ March 30, 2022
  • 70. But … Copyright 2022, http://www.allaroundtheworld.fr/ 30 mars 2022
  • 72. class Name { field $name :param; field $title :param { undef }; method name () { return $title ? "$title $name" : $name; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 73. Type Library package Our::Types { use Less::Boilerplate; use Type::Library -base; use Type::Utils -all; use Type::Params; our @EXPORT_OK; BEGIN { extends qw( Types::Standard Types::Common::Numeric Types::Common::String ); push @EXPORT_OK => qw/compile compile_named/; } } 1; 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/
  • 74. Corinna + Types class Name { use Our::Types qw(NonEmptyStr Maybe compile); field $name :param; field $title :param { undef }; ADJUST { state $check = compile(NonEmptyStr,Maybe[NonEmptyStr]); $check->( $name, $title ); } method name () { return $title ? "$title $name" : $name; } } 30 mars 2022 Copyright 2022, http://www.allaroundtheworld.fr/

Notas do Editor

  1. Apologies, I must leave tomorrow (scheduling conflict)
  2. Confession: my first versions of Corinna had the same flaw.
  3. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,
  4. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,
  5. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,
  6. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,
  7. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,
  8. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,
  9. Offers modern OO facilites *and* is uses UNIVERSAL::Object for newer OO frameworks to be built on top of it!
  10. Instead of my coding limitations, I would be limited by my imagination
  11. Same ideas, different syntax: not offering anything new
  12. These are many positive side-effects emerging from one simple design change.
  13. These are many positive side-effects emerging from one simple design change.
  14. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,
  15. Most OOP systems in Perl are built on top of this. No built-in notion of state or encapsulation,