📚 The CoCalc Library - books, templates and other resources
License: OTHER
%!TEX root = Programmierparadigmen.tex1\chapter{Scala}2\index{Scala|(}34Scala ist eine objektorientierte und funktionale Programmiersprache, die auf der JVM aufbaut und in Java Bytecode kompiliert wird. Scala bedeutet \underline{sca}lable5\underline{la}nguage.67Mit sog. \enquote{actors} bietet Scala eine Unterstützung für die Entwicklung8prallel ausführender Programme.910Weitere Materialien sind unter \url{http://www.scala-lang.org/} und11\url{http://www.simplyscala.com/} zu finden.1213\section{Erste Schritte}14Scala kann auf Debian-basierten Systemen durch das Paket \texttt{scala} installiert15werden. Für andere Systeme stehen auf \url{http://www.scala-lang.org/download/}16verschiedene Binärdateien bereit.1718\subsection{Hello World}19\subsubsection{Interaktiv}20\inputminted[numbersep=5pt, tabsize=4]{bash}{scripts/scala/scala-test.scala}21Es kann mit \texttt{./scala-test.scala Scala funktioniert} ausgeführt werden.2223\subsubsection{Kompiliert}24\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=hello-world.scala]{scala}{scripts/scala/hello-world.scala}2526Dieses Beispiel kann mit \texttt{scalac hello-world.scala} kompiliert und mit27\texttt{scala HelloWorld} ausgeführt werden.2829\section{Vergleich mit Java}30Scala und Java haben einige Gemeinsamkeiten, wie den Java Bytecode, aber auch31einige Unterschiede.3233\noindent\parbox[t]{2.4in}{\raggedright%34\textbf{\textit{Gemeinsamkeiten}}35\begin{itemize}[topsep=0pt,itemsep=-2pt,leftmargin=13pt]36\item Java Bytecode37\item Keine Mehrfachvererbung38\item Statische Typisierung39\item Scopes40\end{itemize}41}%42\parbox[t]{2.4in}{\raggedright%43\textbf{\textit{Unterschiede}}44\begin{itemize}[topsep=0pt,itemsep=-2pt,leftmargin=13pt]45\item Java hat Interfaces, Scala hat traits.46\item Java hat primitive Typen, Scala ausschließlich Objekte.47\item Scala benötigt kein \texttt{;} am Ende von Anweisungen.48\item Scala ist kompakter.49\item Java hat \texttt{static}, Scala hat \texttt{object} (Singleton)50\end{itemize}51}5253Weitere Informationen hat Graham Lea unter \url{http://tinyurl.com/scala-hello-world} zur Verfügung gestellt.5455\section{Syntax}56In Scala gibt es sog. \textit{values}, die durch das Schlüsselwort \texttt{val}\xindex{val (Scala)@\texttt{val} (Scala)}57angezeigt werden. Diese sind Konstanten. Die Syntax ist der UML-Syntax ähnlich.5859\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/val-syntax.scala}6061Variablen werden durch das Schlüsselwort \texttt{var}\xindex{var (Scala)@\texttt{var} (Scala)} angezeigt:6263\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/var-syntax.scala}6465Methoden werden mit dem Schlüsselwort \texttt{def}\xindex{def (def)@\texttt{def} (Scala)} erzeugt:6667\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/method-syntax.scala}6869Klassen werden wie folgt erstellt:70\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/simple-class-example.scala}7172und so instanziiert:73\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/simple-class-instanciation.scala}7475\subsection{Schleifen}\xindex{for (Scala)@\texttt{for} (Scala)}76Eine einfache \texttt{for}-Schleife sieht wie folgt aus:7778\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/extended-for.scala}7980Listen können erstellt und durchgegangen werden:8182\inputminted[numbersep=5pt, tabsize=4]{scala}{scripts/scala/extended-for.scala}8384\subsection{Logische Operatoren}85\begin{table}[H]86\centering87\begin{tabular}{CCCC}88UND & ODER & Wahr & Falsch \\ \hline\hline89\&\& & || & true & false \\[4ex]90GLEICH & UNGLEICH & NICHT & ~ \\ \hline\hline91== & != & ! & ~ \\92\end{tabular}93\caption{Logische Operatoren in Scala}\xindex{Logische Operatoren!Scala}94\end{table}9596\section{Datenstrukturen}97\subsection{Listen}9899\begin{itemize}100\item Erstellt man mit \verb+var myList = List();+101\item Zugriff auf das \verb+i+-te Element mit \verb+myList(i)+102\end{itemize}103104\subsection{Tupel}105106\begin{itemize}107\item Erstellt man mit \verb+var myTuple = (el1, el2, el3)+108\item Zugriff auf das \verb+i+-te Element mit \verb+myTuple._i+109\end{itemize}110111\section{Companion Object}\xindex{Companion Object}112Ein Companion Object ist ein Objekt mit dem Namen einer Klasse oder eines Traits.113Im Gegensatz zu anderen Objekten / Traits hat das Companion Object zugriff auf114die Klasse.115116\section{actor}117\begin{definition}[Aktor]\xindex{Aktor}\index{actor|see{Aktor}}%118Ein \textit{Aktor} ist ein Prozess, der nebenläufig zu anderen Aktoren119läuft. Er kommuniziert mit anderen Aktoren, indem er Nachrichten austauscht.120\end{definition}121122Das folgende Wetter-Beispiel zeigt, wie man Aktoren benutzen kann.123124\subsection{Message Passing}\xindex{"! (Scala)}%125Prozesse können nach dem Schema \texttt{adresse ! Nachricht} Nachrichten austauschen.126Dieses Schema ist asynchron.127128Prozesse können mit \texttt{receive{case x => print(x)}} Nachrichten empfangen,129wobei in diesem Beispiel \texttt{x} alles matcht. Wenn eine gesendete Nachricht130vom Empfänger nicht gematcht wird, bleibt sie dennoch gespeichert.131132\section{Weiteres}133\texttt{def awaitAll(timeout: Long, fts: Future[Any]*):}\\134\-\hspace{1.8cm}\texttt{List[Option[Any]]}\xindex{awaitAll}\\135\-\hspace{0.8cm}$\leftharpoonup$ \texttt{scala.actors.Futures.\_}136137Waits until either all futures are resolved or a given time span has passed. Results are collected in a list of options. The result of a future that resolved during the time span is its value wrapped in Some. The result of a future that did not resolve during the time span is None.138139Note that some of the futures might already have been awaited, in which case their value is returned wrapped in Some. Passing a timeout of 0 causes awaitAll to return immediately.140141142\section{Beispiele}143\subsection{Wetter}144Das folgende Script sendet parallel Anfragen über verschiedene ZIP-Codes an145die Yahoo-Server, parst das XML und extrahiert die Stadt sowie die Temperatur:146147\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=weather.scala]{scala}{scripts/scala/weather.scala}148149\subsection{High Product}150Das folgende Skript berechnet folgendes: Wenn man aus den Ziffern 0 - 9 zwei151Zahlen $a$, $b$ bilden darf, welche Zahlen muss man dann bilden um das größte Produkt152$a \cdot b$ zu erhalten?153154\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=main.scala]{scala}{scripts/scala/HighProduct.scala}155156\subsection{Potenzierung}157Will man Zweierpotenzen bilden, so kann man die Berechnung beschleunigen, in dem158man immer wieder Quadriert:159160\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=power-futures.scala]{scala}{scripts/scala/power-futures.scala}161162\subsection{Coffeetime 01: Two Bases}163Find three digits $X$, $Y$ and $Z$ such that $XYZ$ in base 10 is equal to $ZYX$164in base 9.165166\inputminted[linenos, numbersep=5pt, tabsize=2, frame=lines, label=01-TwoBases.scala]{scala}{scripts/scala/01-TwoBases.scala}167168\subsection{Coffeetime 04: Exactly a third}169Arrange the numerals 1-9 into a single fraction that equals exactly170$\frac{1}{3}$.171172No other math symbols wanted; just concatenation some digits for the173numerator, and some to make a denominator.174175\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=04-ExactlyAThird.scala]{scala}{scripts/scala/04-ExactlyAThird.scala}176177\subsection{Coffeetime 05: Three Dice}\xindex{yield (Scala)@\texttt{yield} (Scala)}178I roll three dice, and multiply the three numbers together.179180What is the probability the total will be odd?181182\inputminted[linenos, numbersep=5pt, tabsize=4, frame=lines, label=05-ThreeDice.scala]{scala}{scripts/scala/05-ThreeDice.scala}183184\section{Weitere Informationen}185\begin{itemize}186\item \url{http://www.scala-lang.org/api}187\item \url{http://docs.scala-lang.org/style/naming-conventions.html}188\end{itemize}189190\index{Scala|)}191192