754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 1
\documentclass{article}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 2
\usepackage{../style}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 3
\usepackage{../langs}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 4
\usepackage{marvosym}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 5
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 6
%cheat sheet
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 7
%http://worldline.github.io/scala-cheatsheet/
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 8
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 9
\begin{document}
755
+ − 10
\fnote{\copyright{} Christian Urban, King's College London, 2020}
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 11
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 12
\section*{Scala in 6CCS3CFL}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 13
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 14
For the coursework in this module you are free to use any programming
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 15
language you like, but I will show you all my code using Scala---I hope
755
+ − 16
you have fond memories of Scala from PEP. But as said, you do not need to
+ − 17
use Scala for your own code.\footnote{Haskell, Rust, Ocaml were other languages that have been used previously in CFL. I recommend to not use Java or C for writing
+ − 18
a compiler, but if you insist, nothing I can do.} I will use the current
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 19
stable version of Scala, which is 2.13.3. If you need a reminder of
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 20
the Scala handouts for PEP have a look
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 21
\hr{http://talisker.nms.kcl.ac.uk/cgi-bin/repos.cgi/pep-material/raw-file/tip/handouts/pep-ho.pdf}\bigskip
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 22
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 23
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 24
The main difference to the Scala I showed you in PEP is that in CFL
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 25
I will use the Ammonite REPL
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 26
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 27
\begin{quote}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 28
\url{https://ammonite.io/#Ammonite-REPL}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 29
\end{quote}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 30
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 31
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 32
This is a drop-in replacement for the original Scala REPL and
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 33
works very similarly, for example
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 34
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 35
\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 36
$ amm
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 37
Loading...
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 38
Welcome to the Ammonite Repl 2.2.0 (Scala 2.13.3 Java 9)
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 39
scala> 1 + 2
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 40
res0: Int = 3
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 41
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 42
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 43
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 44
Ammonite uses the same Scala compiler, just adds some useful features
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 45
on top of it. It is quite main-stream in the Scala community and it should
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 46
therefore be very easy for you to install \texttt{amm}. The big
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 47
advantage of Ammonite is that it comes with some additional libraries
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 48
already built-in and also allows one to easily break up code into
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 49
smaller modules. For example reading and writing files in Ammonite can
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 50
be achieved with
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 51
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 52
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 53
scala> import ammonite.ops._
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 54
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 55
scala> read(pwd / "file.name")
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 56
res1: String = """..."""
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 57
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 58
scala> write.over(pwd / "file.name", "foo bar")
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 59
\end{lstlisting}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 60
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 61
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 62
For loading and accessing code from another Scala file, you can import it
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 63
as follows:
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 64
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 65
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 66
import $file.name-of-the-file
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 67
import name-of-the-file._
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 68
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 69
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 70
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 71
This assumes the other Scala file is called
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 72
\texttt{name-of-the-file.sc} and requires the file to be in the same
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 73
directory where \texttt{amm} is working in. This will be very convenient
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 74
for the compiler we implement in CFL, because it allows us to easily
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 75
break-up the code into the lexer, parser and code generator.
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 76
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 77
Another feature which exists in Ammonite, but not yet in the
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 78
current version of Scala (it will be in the next version called dotty)
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 79
is that you can mark functions as \texttt{@main}. For example
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 80
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 81
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 82
@main
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 83
def foo() = ...
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 84
\end{lstlisting}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 85
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 86
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 87
This means you can now call that function from the command line like
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 88
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 89
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 90
$ amm file.sc foo
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 91
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 92
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 93
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 94
If you want to specify an argument on the commandline, say an int and
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 95
a string, then you can write
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 96
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 97
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 98
@main
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 99
def bar(i: Int, s: String) = ...
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 100
\end{lstlisting}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 101
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 102
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 103
and then call
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 104
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 105
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 106
$ amm file.sc 42 foobar
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 107
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 108
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 109
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 110
What is also good in Ammonite that you can specify more than one
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 111
function to be ``main'' and then specify on the command line which
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 112
function do you want to run as entry-point.\bigskip
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 113
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 114
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 115
To sum up, Ammonite is a really useful addition to the Scala ecosystem.
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 116
You can find more information about how to use it in the first five chapters
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 117
of the ``Hands-on Scala'' book by Li Haoyi. These chapters are
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 118
free and can be used as a reference, see:
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 119
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 120
\begin{center}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 121
\url{https://www.handsonscala.com/part-i-introduction-to-scala.html}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 122
\end{center}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 123
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 124
\end{document}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 125
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 126
%%% Local Variables:
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 127
%%% mode: latex
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 128
%%% TeX-master: t
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 129
%%% End: