\chapter{Scala}
\index{Scala|(}

Scala ist eine objektorientierte und funktionale Programmiersprache, die auf der JVM aufbaut und in Java Bytecode kompiliert wird. Scala bedeutet \underline{sca}lable
\underline{la}nguage.

Mit sog. \enquote{actors} bietet Scala eine Unterstützung für die Entwicklung
prallel ausführender Programme.

Weitere Materialien sind unter \url{http://www.scala-lang.org/} und
\url{http://www.simplyscala.com/} zu finden.

\section{Erste Schritte}
Scala kann auf Debian-basierten Systemen durch das Paket \texttt{scala} installiert
werden. Für andere Systeme stehen auf \url{http://www.scala-lang.org/download/}
verschiedene Binärdateien bereit.

\subsection{Hello World}
\subsubsection{Interaktiv}
\inputminted[numbersep=5pt, tabsize=4]{bash}{scripts/scala/scala-test.scala}
Es kann mit \texttt{./scala-test.scala Scala funktioniert} ausgeführt werden.

\subsubsection{Kompiliert}
\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.scala]{scala}{scripts/scala/hello-world.scala}

Dieses Beispiel kann mit \texttt{scalac hello-world.scala} kompiliert und mit
\texttt{scala HelloWorld} ausgeführt werden.

\section{Vergleich mit Java}
Scala und Java haben einige Gemeinsamkeiten, wie den Java Bytecode, aber auch
einige Unterschiede.

\noindent\parbox[t]{2.4in}{\raggedright%
\textbf{\textit{Gemeinsamkeiten}}
\begin{itemize}[topsep=0pt,itemsep=-2pt,leftmargin=13pt]
    \item Java Bytecode
    \item Keine Mehrfachvererbung
    \item Statische Typisierung
    \item Scopes
\end{itemize}
}%
\parbox[t]{2.4in}{\raggedright%
\textbf{\textit{Unterschiede}}
\begin{itemize}[topsep=0pt,itemsep=-2pt,leftmargin=13pt]
    \item Java hat Interfaces, Scala hat traits.
    \item Java hat primitive Typen, Scala ausschließlich Objekte.
    \item Scala benötigt kein \texttt{;} am Ende von Anweisungen.
    \item Scala ist kompakter.
    \item Java hat \texttt{static}, Scala hat \texttt{object} (Singleton)
\end{itemize}
}

Weitere Informationen hat Graham Lea unter \url{http://tinyurl.com/scala-hello-world} zur Verfügung gestellt.

\section{Syntax}
In Scala gibt es sog. \textit{values}, die durch das Schlüsselwort \texttt{val}\xindex{val}
angezeigt werden. Diese sind Konstanten. Die Syntax ist der UML-Syntax ähnlich.

\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/val-syntax.scala}

Variablen werden durch das Schlüsselwort \texttt{var}\xindex{var} angezeigt:

\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/var-syntax.scala}

Methoden werden mit dem Schlüsselwort \texttt{def}\xindex{def} erzeugt:

\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/method-syntax.scala}

Klassen werden wie folgt erstellt:
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/simple-class-example.scala}

und so instanziiert:
\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/simple-class-instanciation.scala}

Listen können erstellt und durchgegangen werden:

\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/extended-for.scala}

\section{Companion Object}\xindex{Companion Object}
Ein Companion Object ist ein Objekt mit dem Namen einer Klasse oder eines Traits.
Im Gegensatz zu anderen Objekten / Traits hat das Companion Object zugriff auf
die Klasse.

\section{actor}\xindex{actor}
actor dient der Concurrency.

\section{Beispiele}
\subsection{Wetter}
Das folgende Script sendet parallel Anfragen über verschiedene ZIP-Codes an
die Yahoo-Server, parst das XML und extrahiert die Stadt sowie die Temperatur:

\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=weather.scala]{scala}{scripts/scala/weather.scala}

\section{Weitere Informationen}
\begin{itemize}
    \item \url{http://docs.scala-lang.org/style/naming-conventions.html}
\end{itemize}

\index{Scala|)}