%% Presentation about Internal DSLs in Python

%% Some useful variations of the document class
%%\documentclass[ignorenonframetext,draft]{beamer}
%%\documentclass[ignorenonframetext,handout]{beamer}
\documentclass[ignorenonframetext]{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\mode<presentation>{\usetheme{Copenhagen}}
\title{DSLs in Python}
\author{Marek~Kubica}
\date{13.~März~2008}

%% get rid of navigation symbols
\beamertemplatenavigationsymbolsempty

\begin{document}

\frame{\titlepage}

\begin{frame}
  \frametitle{Der Plan}
  \begin{itemize}
    \item Dieser Vortrag lebt vom Feedback!
    \item daher: Fragen und Anmerkungen explizit erwünscht
    \item Chris Okazaki hat Recht: Vortrag in eine Richtung ist langweilig
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Ganz kurze Einleitung}
  \begin{block}{DSLs?}
    \begin{itemize}
      \item Domänenspezifische Programmiersprachen -- \emph{Domain Specific Languages}
      \item Kleine Sprachen die für kleine, klar umrissene Dinge eingesetzt werden
      \item gegenteil wären General Purpose Sprachen(Python)
      \item Beispiele: GraphViz, sed, Vim script, Elisp, JavaScript
      \item letztere sind auch General Purpose Sprachen
      \pause
      \item Werden aber für gewisse klar gegliederte Aufgabenbereiche eingesetzt
      \item etwa Editor-Skripting, DOM-Editieren
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Zwei Arten von DSLs}
  \begin{block}{Externe DSLs}
    \begin{itemize}
      \item Sind komplette Sprachen, mit allem drum \& dran
      \item Eigene Grammatik, eigene Token, Lexer, Parser, Verhalten
      \item Komplex zu erstellen, dafür aber viele Freiheiten in der Gestaltung
      \pause
      \item Schließlich sind es eigenständige Sprachen
    \end{itemize}
  \end{block}
  \begin{block}{Interne DSLs}
    \begin{itemize}
      \item Untermengen der sie umgebenden Sprache
      \item Also limitierter - aber simpler und einfacher zu verstehen
      \item Einfach zu implementieren - man wälzt alles auf die Hostsprache ab
      \item Oft in Ruby eingesetzt (Rails), aber auch in Python möglich
      \item (in einem anderen Umfang)
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Und nun?}
  \begin{itemize}
    \item Beschäftigen wir uns mit internen DSLs in Python, an einem einfachen 
      Beispiel
    \pause
    \item Warum?
    \pause
    \item Weil man damit einige Probleme lesbarer lösen kann.
    \item lesbar = besser
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Ohne DSLs}
  \begin{itemize}
    \item Was macht der Code in ``playfair-dsless.py''?
    \item Was ist gut, was ist schlecht?
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Das Problem - Playfair implementieren}
  Wikipedia bietet ein gutes Beispiel dafür
  \begin{block}{Klartext}
    \begin{itemize}
      \item Klartext wird in Großbuchstaben gewandelt
      \item Umlaute aufgelöst, J zu I, aufeinanderfolgende Buchstaben durch X getrennt
      \item in Buchstabenpaare geteilt
    \end{itemize}
  \end{block}
  \begin{block}{Schlüssel}
    \begin{itemize}
      \item Alphabet mit 25 Buchstaben (ohne J)
      \item In 5x5-Matrix gesetzt
      \item Buchstaben des Schlüssels werden eingesetzt
      \item Rest wird alphabetisch aufgefüllt
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Playfair-Algorithmus}
  \begin{block}{Verfahren}
    Im großen und ganzen geht es um das tauschen von Buchstaben in der 
    5x5~Matrix.
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Lass Code sprechen}
  \begin{block}{Was brauchen wir so?}
    \begin{itemize}
      \item Ein Alphabet ohne den Buchstaben J
      \item Einen Matrix-Datentyp
      \item Einen Matrix-Element-Datentyp
      \item etwas Glue-Code um das zu verbinden
    \end{itemize}
  \end{block}
  \begin{block}{Wie sieht das dann aus?}
    \begin{itemize}
      \item ``playfair.py''
      \item wie siehts im Vergleich aus?
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Was hat uns das gebracht?}
  \begin{itemize}
    \item Der Code ist länger, ja
    \item Der Code ist leichter zu verstehen
    \item Wir haben einige nette Python-Features genutzt :)
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{Kompliziertere DSLs}
  \begin{block}{Interne}
    \begin{itemize}
      \item Metaprogrammierung (siehe Elixir, Django)
      \item Bytecode-Hacks
    \end{itemize}
  \end{block}
  \begin{block}{Externe}
    \begin{itemize}
      \item Parser (PLY, Pyparsing, Pysec)
      \item Andere Sprachen embedden (Lua, Guile)
    \end{itemize}
  \end{block}
\end{frame}

\end{document}
