\documentclass{beamer}
\usepackage{amsmath}
\usepackage{url}
\usepackage{ucs}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
% This is a not yet finished (German) talk I'll hold at the next meeting of the
% Linux User Group Augsburg (LUGA) (on 2005-05-04).
%
% Compile to PDF using...
% $ pdflatex Perl6_genau_jetzt.latex
%
% Feel free to add/change contents (don't forget to add you to the author
% list)!
% This is an experiment -- I don't think many people have used Subversion to
% collaboratively create a talk. :)
%
% As this talk is German, the following comments are German, too.
% Zielgruppe dieses Vortrags:
% Linux-Benutzer mit Programmiererfahrung in mindestens einer Sprache (bei den
% Codebeispielen unten sind überall auch Entsprechungen in anderen Sprachen als
% Perl 5 und 6 angegeben).
% \begin{langs}
% Perl 5: \> ... \\
% Perl 6: \> ... \\
% \hr
% Ruby: \> ... \\
% (...)
% \end{langs}
\newenvironment{langs}{
\begin{tabbing}
Haskell: \= ... \kill
}{\end{tabbing}}
% Manual syntax highlighting
\newcommand{\synfunc} [1]{\color{blue!50!black}#1\color{black}}
\newcommand{\synstr} [1]{\color{red!50!black}#1\color{black}}
\newcommand{\synvar} [1]{\color{purple!50!black}#1\color{black}}
\newcommand{\synclass} [1]{\color{green!50!black}#1\color{black}}
\newcommand{\syncomment}[1]{\color{blue!20!black}#1\color{black}}
\newcommand{\syncool} [1]{\color{beamer@blendedblue}#1\color{black}}
\newcommand{\synoder} {\ \ \color{black}$\vee$\ \ }
\newcommand{\hr} {\rule[4pt]{\textwidth}{0.1pt}\\}
\title{Perl 6, genau jetzt!}
\author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}}
\institute{LUGA}
\date{4. Mai 2005}
% Outline:
% - Parrot
% - Entstehung
% - Design
% - Perl 6
% - Geschichte
% - Designideen
% - Code-Beispiele (mit Vergleichen zu vielen anderen Sprachen)
% - Mitgestaltungsmöglichkeiten, etc.
% - Pugs
% - Entstehung
% - Überblick
% - "Wie helfe ich?"
% - Ausblick
% - Perl 6 rockz
% - Dank Pugs schon jetzt benutzbar
% - "Man darf gespannt sein"
\usetheme{Warsaw}
\usecolortheme{seahorse}
\setbeamercovered{transparent}
\begin{document}
\frame{\titlepage}
\section{}
\frame{
\frametitle{Inhalt}
\tableofcontents
}
\section{Parrot}
\subsection{"Uberblick}
\frame[t]{
\frametitle{Parrot?}
\begin{itemize}
\item \only<2->{Verdammt schnelle r}\only<1>{R}egisterbasierte virtuelle Maschine
\item Plattformunabhängiger Bytecode
\item "`One bytecode to rule them all"'
\end{itemize}
\pause\pause
\[
\begin{array}{ll}
\text{BASIC} & \text{Forth} \\
\text{Lisp} & \text{Parakeet} \\
\text{Perl 5} & \text{Perl 6} \\
\text{PHP} & \text{Python} \\
\text{Ruby} & \text{Scheme} \\
\text{TCL} & \text{\ldots} \\
\end{array}
\leftrightarrow \text{\syncool{Parrot}} \leftrightarrow
\begin{array}{ll}
\text{BASIC} & \text{Forth} \\
\text{Lisp} & \text{Parakeet} \\
\text{Perl 5} & \text{Perl 6} \\
\text{PHP} & \text{Python} \\
\text{Ruby} & \text{Scheme} \\
\text{TCL} & \text{\ldots} \\
\end{array}
\]
}
\subsection{Architektur}
\frame[t]{
\frametitle{Architektur}
\begin{itemize}
\item Je 64 Register der Typen \texttt{I}, \texttt{N}, \texttt{S} und \texttt{P}
\vspace*{-1em}
\begin{tabbing}
\texttt{I}: \= Int \\
\texttt{N}: \> Num \\
\texttt{S}: \> String \\
\texttt{P}: \> PMC -- Parrot Magic Cookie
\end{tabbing}
\item Bereitstellung von Garbage Collection, Subroutinen, Coroutines,
Continuations, Klassen, Methoden
\item Just In Time-Compiler für meist benutzte Plattformen ⇒ Speed!
\item HLL → PIR → Bytecode → \\
natives Programm, C oder direkte Ausführung
\end{itemize}
}
\subsection{Beteiligungsm"oglichkeiten}
\frame[t]{
\frametitle{Beteiligungsmöglichkeiten}
\begin{itemize}
\item Mailingliste: \\
\texttt{perl6-internals@perl.org}, \\
\texttt{gmane.comp.lang.perl.perl6.internals}
\item IRC: \texttt{\#parrot} auf \texttt{irc.perl.org}
\item Auch Newbies gern gesehen
\item Viele Beteiligungsmöglichkeiten, nicht nur für Programmierer
\item Weitere Informationen: \url{http://www.parrotcode.org/}
\end{itemize}
}
\section{Perl 6}
%\subsection{Entstehung}
%\frame{
% \frametitle{Entstehungsgeschichte}
% \begin{itemize}
% \item Aprilscherz: Kombination von Perl 5 und Python → Parrot
% \item ...
% \end{itemize}
%}
\subsection{Design}
\frame{
\frametitle{"`Die Wasserbett-Theorie"'}
\begin{itemize}
\item<1-> Glattes Wasserbett
\item<2-> Eindrücken an einer Stelle (Vereinfachung) ⇒ \\
Hochkommen an anderen Stellen (Komplizierung)
\end{itemize}
\vfill\pause\pause
\begin{block}{Gleichgewicht}
\begin{itemize}
\item Sehr viele Operatoren: \texttt{+@= /\%\^{} !@=} ↔
\item Sehr wenig Operatoren: \texttt{\synfunc{set}(\synvar{x}, \synfunc{add}(5, 3))}
\end{itemize}
\end{block}
}
\frame[t]{
\frametitle{Huffmann-Komprimierung}
\begin{itemize}
\item Häufig genutzte Features → \\
kurze Namen (z.B. \texttt{\synfunc{say}}, \texttt{\synfunc{cat}})
\item Selten genutzte Features → \\
lange Namen (z.B. \texttt{\synfunc{gethostbyname}},
\texttt{\synfunc{nautilus-file-management-properties}})
\end{itemize}
}
\frame[t]{
\frametitle{Freiheit und Anpassung}
\begin{itemize}
\item Kein Zwänge, nur angemessene Standards
\item Bräuche, keine Gesetze
\item "`Nur tote Sprachen ändern sich nicht."'
\end{itemize}
\vfill\pause
\begin{block}{Möglichkeiten der Anpassung}
\begin{itemize}
\item Überschreiben/Erweitern von Builtins und Operatoren
\item C-like und Lisp-like Makros
\pause
\item Neudefinition der Grammatik: \\
\texttt{%
\synfunc{use}\ \synclass{Grammar::Python};\\
\synvar{x}\ = [ \synvar{foo}(), \synvar{bar}() ]\\
\synvar{x}.\synvar{push}(3)
}
\end{itemize}
\end{block}
}
\frame[t]{
\frametitle{DWIM -- Do What I Mean}
\begin{itemize}
\item Do What I Mean
\item Nicht immer gleich Do What You Mean
\end{itemize}
\vfill\pause
\begin{block}{Beispiele}
\texttt{%
5 + 3*2\ \ \ \ \ \ \ \ \# 5 + (3*2)\\
\synfunc{s}:2nd/\synstr{foo}/\synstr{bar}/\ \syncomment{\# Zweites "foo"\ → "bar"}\\
\synfunc{s}:2th/\synstr{foo}/\synstr{bar}/\ \syncomment{\# ditto}
}
\end{block}
}
\frame[t]{
\frametitle{"`Ausleihen"'}
\begin{itemize}
\item "`Ausleihen"' von Features aus anderen Sprachen
\item Zusammenarbeit zwischen den Sprachenentwicklern
\end{itemize}
\vfill\pause
\begin{block}{Beispiele}
\begin{itemize}
\item \texttt{.} als Methodenaufrufoperator (von Python, Ruby und vielen
anderen Sprachen)
\item Pragmas (ursprünglich von C)
\item Klammern: "`Oha! Hier ist etwas anders als normal!"' (Perl 5, Ruby,
Mathematik) \\
\begin{itemize}
\item $5 + \left(3 \cdot 2\right)$ → $5 + 3 \cdot 2$
\item \texttt{\synfunc{say}(...)} → \texttt{\synfunc{say}\ ...}
\end{itemize}
\end{itemize}
\end{block}
}
\subsection{Codebeispiele}
\frame{
\frametitle{"`Hello World"'}
\begin{langs}
Perl 6: \> \texttt{\synfunc{say}\ \ \ "\synstr{Hello, World!}";} \\
Perl 5: \> \texttt{\synfunc{print}\ "\synstr{Hello, World!\textbackslash{}n}";} \\
\hr
C: \> \texttt{\synfunc{printf}("\synstr{\%s\textbackslash{}n}", "\synstr{Hello, World!}");} \\
Haskell: \> \texttt{\synfunc{putStrLn}\ "\synstr{Hello, World!}"} \\
Lua: \> \texttt{\synfunc{print}\ "\synstr{Hello, World!}";} \\
PHP: \> \texttt{\synfunc{print}("\synstr{Hello, World!\textbackslash{}n}");} \\
Python: \> \texttt{\synfunc{print}\ "\synstr{Hello, World!}"} \\
Ruby: \> \texttt{\synfunc{puts}\ \ "\synstr{Hello, World!}"} \\
Shell: \> \texttt{\synfunc{echo}\ \ "\synstr{Hello, World!}"} \\
Tcl: \> \texttt{\synfunc{puts}\ \ "\synstr{Hello, World!}"}
\end{langs}
}
\frame[t]{
\frametitle{Variablen}
\begin{itemize}
\item<1-> Haupttypen: \\
\texttt{\synvar{\$scalar}}, \texttt{\synvar{@array}},
\texttt{\synvar{\%hash}}, \texttt{\synvar{\&code}}
\item<2-> Dereferenzierung: \\
\texttt{\synvar{@array}[3]}, \\
\texttt{\synvar{\%hash}\{"\synstr{key}"\}},
\texttt{\synvar{\%hash}<\synstr{key}>}, \\
\texttt{\synvar{\&code}(argumente)}
\item<3-> Slices: \\
\texttt{\synvar{@array}[23, 42]}, \\
\texttt{\synvar{\%hash}\{"\synstr{ingo}", "\synstr{larry}"\}}
\end{itemize}
}
%\frame{
% \frametitle{Tastatureingabe}
% \begin{langs}
% Perl 6: \> \texttt{\synfunc{my}\ \synvar{\${}text}\ = =\synvar{\${}*IN};} \\
% Perl 5: \> \texttt{\synfunc{my}\ \synvar{\${}text}\ = <\synvar{STDIN}>;} \\
% \hr
% C: \> \texttt{\synfunc{scanf}("\synstr{\%s}", \&{}\synvar{text});} \\
% Haskell: \> \texttt{\synvar{x}\ <- \synfunc{getLine}} \\
% Lua: \> \texttt{\synvar{text}\ = \synfunc{io.read}()} \\
% PHP: \> \texttt{\synvar{\${}text}\ = \synfunc{readline}();} \\
% Python: \> \texttt{\synvar{text}\ = \synfunc{sys.stdin.readline}()} \\
% Ruby: \> \texttt{\synvar{text}\ = \synfunc{gets}} \\
% Shell: \> \texttt{\synfunc{read}\ \synvar{text}} \\
% Tcl: \> \texttt{\synfunc{set}\ \synvar{text}\ [\synfunc{gets}\ \synvar{stdin}]}
% \end{langs}
%}
\frame[t]{
\frametitle{Operatoren}
\begin{itemize}
\item<1-> Standard-Operatoren:
\begin{itemize}
\item \texttt{+ * - / \~{}}
\item \texttt{[] \{\}}
\item \texttt{.}
\item \texttt{...} (Yadda-Yadda)
\end{itemize}
\item<2-> Chained Operators: \texttt{23 < \synvar{\$a}\ < 42}
\item<3-> Kontextspezifizierer: \\
\begin{itemize}
\item \texttt{+\synvar{@array}} (Anzahl Elemente in
\texttt{\synvar{@array}})
\item \texttt{\~{}\synvar{@array}} (\texttt{\synvar{@array}} als
Zeichenkette)
\item \texttt{?{}\synvar{@array}} ("`Enthält \texttt{\synvar{@array}}
Elemente?"')
\end{itemize}
\item<4-> Hyper-Operatoren: \\
\texttt{%
\symbol{91}1, 2, 3] »*« 2\ \ \ \ \ \ \ \ \ \# \symbol{91}2, 4, 6]\\
\symbol{91}1, 2, 3] »+« \symbol{91}4, 5, 6] \# \symbol{91}5, 7, 9]\\
}
\end{itemize}
}
\frame{
\frametitle{Junctions}
\begin{block}{"`Wenn \texttt{\$a} einen dieser Werte hat, dann..."'}
\begin{langs}
Perl 5: \> \texttt{\synfunc{if}(\synvar{\$a}\ == 3 || \synvar{\$a}\ == 5 || \synvar{\$a}\ == 7) \{...\}} \\
Perl 6: \> \texttt{\synfunc{if}\ \synvar{\$a}\ == 3|5|7 \{...\}}
\end{langs}
\end{block}
\pause
\begin{block}{"`Wenn alle mindestens 18 sind, dann..."'}
\begin{langs}
Perl 5: \> \texttt{\synfunc{if}(\synfunc{grep}(\{ \synvar{\$\_}->\synvar{age}\ < 18 \} \synvar{@leute}) == 0) \{...\}} \\
Perl 6: \> \texttt{\synfunc{if}\ \synfunc{all}(\synvar{@leute}».\synvar{age}) >= 18 \{...\}}
\end{langs}
\end{block}
\pause
\only<1-3>{
\begin{block}{"`Wenn mindestens einer mindestens 18 ist, dann..."'}
\begin{langs}
Perl 5: \> \texttt{\synfunc{if}(\synfunc{grep}\ \{ \synvar{\$\_}->\synvar{age}\ >= 18 \} \synvar{@leute}) \{...\}} \\
Perl 6: \> \texttt{\synfunc{if}\ \synfunc{any}(\synvar{@leute}».\synvar{age}) >= 18 \{...\}}
\end{langs}
\end{block}
}
\only<4>{
\begin{block}{"`Wenn genau einer einer mindestens 18 ist, dann..."'}
\begin{langs}
Perl 5: \> \texttt{\synfunc{if}(\synfunc{grep}(\{ \synvar{\$\_}->\synvar{age}\ >= 18 \} \synvar{@leute}) == 1) \{...\}} \\
Perl 6: \> \texttt{\synfunc{if}\ \synfunc{one}(\synvar{@leute}».\synvar{age}) >= 18 \{...\}}
\end{langs}
\end{block}
}
}
\frame{
\frametitle{Smartmatching ("`Extreme DWIM"')}
\texttt{%
\syncomment{\# Enthält \synvar{\$str}\ "\synstr{foo}"?}\\
\synfunc{if}\ \synvar{\$str}\ \~{}\~{} \synfunc{m}/\synstr{foo}/\ \ \ \{...\}\\
\ \pause\\
\syncomment{\# Enthält \synvar{@array}\ "\synstr{ingo}"?}\\
\synfunc{if}\ "\synstr{ingo}"\ \~{}\~{} \synvar{@array}\ \{...\}\\
\ \pause\\
\syncomment{\# Gibt es einen Key "\synstr{ingo}"\ in \synvar{\%hash}?}\\
\synfunc{if}\ "\synstr{ingo}"\ \~{}\~{} \synvar{\%hash}\ \ \{...\}\\
\ \pause\\
\syncomment{\# Sind \synvar{@foo}\ und \synvar{@bar}\ identisch?}\\
\synfunc{if}\ \synvar{@foo}\ \~{}\~{} \synvar{@bar}\ \ \ \ \ \{...\}\\
}
}
\frame{
\frametitle{Subroutines -- Definition}
\begin{langs}
Perl 6: \> \texttt{\synfunc{sub}\ \synvar{foo}(\synclass{Num}\ \synvar{\${}i}) \{ \synfunc{say}\ \synvar{\$i}\ + 3 \}} \\
Perl 5: \> \texttt{\synfunc{sub}\ \synvar{foo}\ \{ \synfunc{my}\ \synvar{\${}i}\ = \synfunc{shift}; \synfunc{print}\ \synvar{\${}i}\ + 3, "\synstr{\textbackslash{}n}"\ \} } \\
\hr
C: \> \texttt{\synclass{void}\ \synvar{foo}(\synclass{float}\ i) \{ \synfunc{printf}("\synstr{\%f\textbackslash{}n}", i + 3); \}} \\
Haskell: \> \texttt{\synvar{foo}\ \synvar{i}\ = \synfunc{putStrLn}\ . \synfunc{show}\ \${} \synvar{i}\ + 3} \\
Lua: \> \texttt{\synfunc{function}\ \synvar{foo}(\synvar{i}) \synfunc{print}(\synvar{i}\ + 3) \synfunc{end}} \\
PHP: \> \texttt{\synfunc{function}\ \synvar{foo}(\synvar{\${}i}) \{ \synfunc{print}(\synvar{\${}i}\ + 3); \}} \\
Python: \> \texttt{\synfunc{def}\ \synvar{foo}(\synvar{i}): \synfunc{print}\ \synvar{i}\ + 3} \\
Ruby: \> \texttt{\synfunc{def}\ \synvar{foo}(\synvar{i}) \synfunc{puts}\ \synvar{i}\ + 3 \synfunc{end}} \\
Shell: \> \texttt{\synfunc{function}\ \synvar{foo}\ \{ \synfunc{echo}\ \${}((\${}1 + 3)); \}} \\
Tcl: \> \texttt{\synfunc{proc}\ \synvar{foo}\ \{\synvar{i}\} \{ \synfunc{puts}\ [\synfunc{expr}\ \${}\synvar{i}\ + 3] \}}
\end{langs}
}
\frame{
\frametitle{Subroutines -- Aufruf}
\begin{langs}
Perl 6: \> \texttt{\synvar{foo}\ 42; \synoder \synvar{foo}\ \synstr{i}\ => 42; \synoder \synvar{foo}\ :\synstr{i}(42);} \\
Perl 5: \> \texttt{\synvar{foo}\ 42;}\\
\hr
C: \> \texttt{\synvar{foo}(42);}\\
Haskell: \> \texttt{\synvar{foo}\ 42}\\
Lua: \> \texttt{\synvar{foo}(42)}\\
PHP: \> \texttt{\synvar{foo}(42);}\\
Python: \> \texttt{\synvar{foo}(42)}\\
Ruby: \> \texttt{\synvar{foo}\ 42}\\
Shell: \> \texttt{\synvar{foo}\ 42}\\
Tcl: \> \texttt{\synvar{foo}\ 42}\\
\end{langs}
}
\subsection{Objektorientierung}
\frame{
\frametitle{Klassendefinition und -instantiierung in anderen Sprachen}
\begin{block}{Perl 5}\texttt{%
\synfunc{package}\ \synclass{Foo};\\
\synfunc{sub}\ \synvar{new}\ \ \ \ \ \ \ \ \ \{ \synfunc{bless}\ \{\}, \synfunc{shift}\ \}\\
\synfunc{sub}\ \synvar{hallo}\ \ \ \ \ \ \ \{ "\synstr{Hallo}\ "\ . \synvar{\$\_}[1] . "\synstr{!}"\ \}\\
\synfunc{sub}\ \synvar{bar}\ :lvalue \{ \synvar{\$\_}[0]->\{\synstr{foo}\} \}\\
\ \\
\ \\
\ \\
\syncomment{\# Dann:}\\
\synfunc{my}\ \synvar{\$obj}\ = \synclass{Foo}->\synvar{new};\\
\synvar{\$obj}->\synvar{bar}\ = 42;\\
\synfunc{print}\ \synvar{\$obj}->\synvar{hallo}("\synstr{Ingo}");\\
}\end{block}
}
\frame{
\frametitle{Klassendefinition und -instantiierung in anderen Sprachen}
\begin{block}{PHP}\texttt{%
\synfunc{class}\ \synclass{Foo}\ \{\\
\ \ \synfunc{var}\ \synvar{\$bar};\\
\ \ \synfunc{function}\ \synvar{hallo}(\synvar{\$name}) \{\\
\ \ \ \ \synfunc{return}\ "\synstr{Hallo }\synvar{\$name}\synstr{!}";\\
\ \ \}\\
\}\\
\ \\
\syncomment{\# Dann:}\\
\synvar{\$obj}\ = \synfunc{new}\ \synclass{Foo}();\\
\synvar{\$obj}->\synvar{bar}\ = 42;\\
\synfunc{print}\ \synvar{\$obj}->\synvar{hallo}("\synstr{Ingo}");\\
}\end{block}
}
\frame{
\frametitle{Klassendefinition und -instantiierung in anderen Sprachen}
\begin{block}{Python}\texttt{%
\synfunc{class}\ \synclass{Foo}:\\
\ \ \synvar{bar}\ = \synvar{None}\\
\ \ \synfunc{def}\ \synvar{hallo}(\synvar{self}, \synvar{name}):\\
\ \ \ \ \synfunc{return}\ "\synstr{Hallo \%s!}"\ \% \synvar{name}\\
\ \\
\ \\
\ \\
\syncomment{\# Dann:}\\
\synvar{obj}\ = \synclass{Foo}()\\
\synvar{obj}.\synvar{bar}\ = 42\\
\synfunc{print}\ \synvar{obj}.\synvar{hallo}("\synstr{Ingo}")\\
}\end{block}
}
\frame{
\frametitle{Klassendefinition und -instantiierung in anderen Sprachen}
\begin{block}{Ruby}\texttt{%
\synfunc{class}\ \synclass{Foo}\\
\ \ \synfunc{attr\_accessor}\ :\synvar{bar}\\
\ \ \synfunc{def}\ \synvar{hallo}(\synvar{name})\\
\ \ \ \ \synfunc{return}\ "\synstr{Hallo \#\{}\synvar{name}\synstr{\}!}"\\
\ \ \synfunc{end}\\
\synfunc{end}\\
\ \\
\syncomment{\# Dann:}\\
\synvar{obj}\ = \synclass{Foo}.\synvar{new}\\
\synvar{obj}.\synvar{bar}\ = 42\\
\synfunc{puts}\ \synvar{obj}.\synvar{hallo}("\synstr{Ingo}")\\
}\end{block}
}
\frame{
\frametitle{Klassendefinition und -instantiierung in Perl 6}
\begin{block}{Perl 6}\texttt{%
\synfunc{class}\ \synclass{Foo}\ \only<6>{\synfunc{is}\ \synclass{Baz}\ }\{\\
\only<1> {\ \ \synfunc{has}\ \synvar{\${}.bar};\\}
\only<2->{\ \ \synfunc{has}\ \synvar{\${}.bar}\ \synfunc{is}\ \synvar{rw};\\}
\ \ \synfunc{method}\ \synvar{hallo}(\synclass{Str}\ \synvar{\$name}) \{\\
\ \ \ \ \synfunc{return}\ "\synstr{Hallo \{}\synvar{\$name}\synstr{\}!}";\\
\ \ \}\\
\}\\
\ \\
\syncomment{\# Dann:}\\
\synfunc{my}\ \only<4->{\synclass{Foo}\ }\synvar{\$obj}\ \only<5->{.}= \only<1-4>{\synclass{Foo}.}\synvar{new};\\
\only<1> {\synfunc{say}\ \synvar{\$obj}.\synvar{bar};\\}
\only<2->{\synvar{\$obj}.\synvar{bar}\ = 42;\\}
\only<1-2>{\synfunc{say}\ \synvar{\$obj}.\synvar{hallo}("\synstr{Ingo}");\\}
\only<3-> {\synfunc{say}\ \synvar{hallo}\ \synvar{\$obj}: "\synstr{Ingo}";\\}
}\end{block}
}
\frame{
\frametitle{Rollen}
\texttt{%
\synfunc{role}\ \synclass{Logger::Mail}\ \{\\
\ \ \synfunc{method}\ \synvar{log}(\synclass{Str}\ \synvar{\$message}) \{...\}\\
\}\\
\ \\
\synfunc{role}\ \synclass{Logger::Logfile}\ \{\\
\ \ \synfunc{method}\ \synvar{log}(\synclass{Str}\ \synvar{\$message}) \{...\}\\
\}\\
\ \\
\synfunc{class}\ \synclass{NormaleKlasse}\ \only<2->{\synfunc{does}\ \synclass{Logger::Mail}\ }\{...\}\\
\ \\
\synfunc{my}\ \synclass{NormaleKlasse}\ \synvar{\$normales\_{}obj}\ .= \synvar{new}(...);\\
\only<1>{\synvar{\$normales\_{}obj}\ \synfunc{does}\ \synclass{Logger::Mail};}\ \\
\synvar{\$normales\_{}obj}.\synvar{log}(...);\\
}
% \texttt{%
% \synfunc{role}\ \synclass{Num::Cool}\ \{\\
% \ \ \synfunc{method}\ \synvar{sei\_cool}(\synvar{\$self}:) \{\\
% \ \ \ \ \synvar{\$self}\ = 42;\\
% \ \ \}\\
% \}\\
% \ \\
% \syncomment{\# Dann:}\\
% \synfunc{my}\ \synvar{\$num}\ = 23;\\
% \only<1>{\synvar{\$num}\ \synfunc{does}\ \synclass{Num::Cool};\\}
% \only<2>{\synclass{Num}\ \synfunc{does}\ \synclass{Num::Cool};\\}
% \synvar{\$num}.\synvar{sei\_cool}();\\
% \synfunc{say}\ \synvar{\$num};\ \ \ \ \ \ \syncomment{\# 42}\\
% }
}
\frame[t]{
\frametitle{Laziness}
\begin{tabbing}
\texttt{\synfunc{my}\ @prims\symbol{95}{}mal\symbol{95}{}zwei} \= \texttt{=} \= \kill
\texttt{\synfunc{my}\ \synvar{@$\mathbb{N}$}} \> \texttt{=} \> \texttt{(1..Inf);} \\
\texttt{\synfunc{my}\ \synvar{@prims}} \> \texttt{=} \> \texttt{\synvar{@$\mathbb{N}$}.\synvar{grep}:\{ \synvar{is\symbol{95}{}prime}(\$\^{}a, \$\^{}b) \};} \\
\texttt{\synfunc{my}\ \synvar{@prims\symbol{95}{}mal\symbol{95}{}zwei}} \> \texttt{=} \> \texttt{\synvar{@prims}.\synvar{map}:\{ \synvar{\$\^{}zahl}\ * 2 \};} \\
\texttt{\synfunc{say}\ \synvar{@prims\symbol{95}{}mal\symbol{95}{}zwei}\symbol{91}42];}\\
\texttt{\syncomment{\# Gibt das doppelte der 43. Primzahl aus, also 382. :)}}
\end{tabbing}
}
\subsection{Mitgestaltungsm"oglichkeiten}
\frame[t]{
\frametitle{Mitgestaltungsmöglichkeiten}
\begin{itemize}
\item Mailingliste: \\
\texttt{perl6-language@perl.org}, \\
\texttt{gmane.comp.lang.perl.perl6.language}
\item IRC: \texttt{\#perl6} auf Freenode
\item Auch Newbies gern gesehen
\item Viele Beteiligungsmöglichkeiten, nicht nur für Programmierer
\item Weitere Informationen: \url{http://dev.perl.org/perl6/}
\end{itemize}
}
\section{Pugs}
\frame[t]{
\frametitle{"`Perl 6 ist ja schön und gut, aber das dauert doch noch Jahre,
bis es fertig ist!"'}
\begin{itemize}
\item Nur tote Produkte sind "`fertig"'.
\item Parrot steht bereits.
\item Seit dem 1. Februar gibt es nun auch einen Perl 6-Compiler.
\end{itemize}
}
\subsection{"Ubersicht}
\frame[t]{
\frametitle{Pugs}
\begin{itemize}
\item Ursprünglich Haskell-Projekt von Audrey Tang "`als Übung"'
\item Projektbeginn: 1. Februar 2005
\item Nun fast 100 Entwickler
\item Version 6.2.2: Beinahe Alles (!) außer Objektorientierung
\end{itemize}
}
\subsection{Entwicklung}
\frame[t]{
\frametitle{Entwicklung}
\begin{itemize}
\item "`Test-driven development"' --
\item Camelfolks: Schreiben von Tests in Perl 6 für noch nicht
implementierte Features \\
\texttt{%
\ \ \synfunc{is}\ 23 + 42, 64, "\synstr{Einfache Rechnungen funzen.}";\\
\ \ \synfunc{is}\ \~{}\symbol{91}1, 2, 3], "\synstr{1 2 3}",\\
\ \ \ \ "\synstr{Arrays wandeln sich richtig in Strings um.}";\\
\ \ \synfunc{is}\ +\symbol{91}1, 2, 3], 3,\\
\ \ \ \ "\synstr{Arrays wandeln sich richtig in Ints um.}";\\
}
\pause
\item Lambdafolks: Implementierung dieser Features
\item Ergebnis der Zusammenarbeit: \\
Über 4.000 funktionierende Tests
\end{itemize}
}
\subsection{Weitere Pl"ane}
\frame[t]{
\frametitle{Weitere Pläne}
\begin{tabbing}
Pugs 6.283185aaa \= ... \kill
\color{beamer@blendedblue}Pugs 6.0 \> Erstes Release \\
\color{beamer@blendedblue}Pugs 6.2 \> Grundlegende IO- und Kontrollflusselemente, \\\> veränderbare Variablen \\
\color{beamer@blendedblue}Pugs 6.28 \> Klassen \\
\color{beamer@blendedblue}Pugs 6.283 \> Rules und Grammars \\
\color{beamer@blendedblue}Pugs 6.2831 \> Rollen \\
\color{beamer@blendedblue}Pugs 6.28318 \> Makros \\
\color{beamer@blendedblue}Pugs 6.283185 \> Portierung von Pugs von Haskell nach Perl 6 \\
\color{beamer@blendedblue}Pugs $2\pi$ \> Vollendung
\end{tabbing}
}
\subsection{Beteiligungsm"oglichkeiten}
\frame[t]{
\frametitle{Beteiligungsmöglichkeiten}
\begin{itemize}
\item Mailingliste: \\
\texttt{perl6-compiler@perl.org}, \\
\texttt{gmane.comp.lang.perl.perl6.compiler}
\item IRC: \texttt{\#perl6} auf Freenode
\item Auch Newbies gern gesehen
\item Schreiben von Tests (Perl 6), Implementierung (Haskell), Schreiben
von Dokumentation, Portierung von
Perl~5\texttt{|}Python\texttt{|}Ruby\texttt{|}\ldots-Modulen nach
Perl 6, \ldots
\item Weitere Informationen: \url{http://www.pugscode.org/}
\end{itemize}
}
\section{Ausblick}
\frame[t]{
\frametitle{Ausblick}
\begin{itemize}
\item \syncool{Perl 6}\ ist verdammt cool. :)
\item \syncool{Parrot}\ steht bereits und bringt einiges an
Geschwindigkeit für viele Sprachen.
\item Dank \syncool{Pugs}\ kann man schon \syncool{genau jetzt}\ in Perl 6
programmieren.
\end{itemize}
}
% In der bisher noch ungeschriebenen \section über Pugs unbedingt die Sachen
% von http://sial.org/pbot/9451 einbringen! Thanks nothingmuch!
\end{document}