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}
917
+ − 5
\usepackage{tcolorbox}
+ − 6
%% \usepackage[]{hvextern}
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 7
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 8
%cheat sheet
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 9
%http://worldline.github.io/scala-cheatsheet/
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 10
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 11
\begin{document}
917
+ − 12
\fnote{\copyright{} Christian Urban, King's College London, 2020, 2021, 2023}
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 13
917
+ − 14
\section*{Scala 3 in 6CCS3CFL}
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 15
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 16
For the coursework in this module you are free to use any programming
756
+ − 17
language you like, but I will show you all my code using Scala---I
917
+ − 18
hope you have fond memories of Scala from PEP. The only difference
965
+ − 19
with PEP is that I will the Ammonite REPL for Scala 3.
830
+ − 20
917
+ − 21
\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black]
+ − 22
If you intend to submit your code for the CW in Scala, you \underline{MUST} submit code that
+ − 23
is compatible with Scala 3!! This is to make it easier for me to test
+ − 24
your code and the changes between Scala 2 from last year PEP to Scala
+ − 25
3 in CFL are not that great. In fact, most changes are just some new
+ − 26
syntax.
+ − 27
\end{tcolorbox}\medskip
+ − 28
+ − 29
\noindent
+ − 30
If you need a reminder of the Scala handouts from PEP updated to Scala 3
+ − 31
have a look here
+ − 32
\hr{http://talisker.nms.kcl.ac.uk/cgi-bin/repos.cgi/pep-material/raw-file/tip/handouts/pep-ho.pdf}. But as said, you do not need to use Scala for the CWs.\footnote{Haskell, Rust, Ocaml were other languages that have
+ − 33
been used previously in CFL. I do not recommend to use Java or C or C++ for
830
+ − 34
writing a compiler, but if you insist, feel free. It has been done
917
+ − 35
before.}
830
+ − 36
\bigskip
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 37
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 38
\noindent
917
+ − 39
The other difference between the Scala I showed you in PEP is that in CFL
+ − 40
I will use the Ammonite REPL (with underlying Scala Version 3):
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 41
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 42
\begin{quote}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 43
\url{https://ammonite.io/#Ammonite-REPL}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 44
\end{quote}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 45
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 46
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 47
This is a drop-in replacement for the original Scala REPL and
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 48
works very similarly, for example
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 49
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 50
\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 51
$ amm
917
+ − 52
Loading...
965
+ − 53
Welcome to the Ammonite Repl 3.0.0-M2 (Scala 3.3.3 Java 21.0.4)
+ − 54
@ 1 + 2
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 55
res0: Int = 3
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 56
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 57
917
+ − 58
%%\runExtCmd[redirect]{ls -la}{voss}
+ − 59
+ − 60
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 61
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 62
Ammonite uses the same Scala compiler, just adds some useful features
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 63
on top of it. It is quite main-stream in the Scala community and it should
838
+ − 64
therefore be very easy for you to install \texttt{amm}. If you work under
+ − 65
a Unix-like system, a sure way to install the right version of Ammonite
+ − 66
is by using \texttt{curl}:
+ − 67
+ − 68
\begin{lstlisting}[numbers=none,language={},basicstyle=\ttfamily\small]
917
+ − 69
$ curl -L https://github.com/com-lihaoyi/Ammonite/releases/\
965
+ − 70
download/3.0.0-M2/3.3-3.0.0-M2 --output amm
917
+ − 71
\end{lstlisting} %% $
838
+ − 72
917
+ − 73
\noindent
924
+ − 74
This creates a file \code{amm} which before it can be run might
936
+ − 75
need some adjustments of the permissions. Under recent versions of
+ − 76
Windows also have \texttt{curl}, but need a slightly different call:
+ − 77
+ − 78
\begin{lstlisting}[numbers=none,language={},basicstyle=\ttfamily\small]
+ − 79
$ curl -L https://github.com/com-lihaoyi/Ammonite/releases/\
965
+ − 80
download/3.0.0-M2/3.3-3.0.0-M2 --output amm.bat
936
+ − 81
\end{lstlisting} %% $
+ − 82
+ − 83
\noindent
+ − 84
Then you need to run Ammonite with \texttt{.$\backslash$amm} and there
+ − 85
is no need to change any permissions under Windows.
+ − 86
759
+ − 87
The big advantage of Ammonite is that it comes with some additional
+ − 88
libraries already built-in and also allows one to easily break up code
+ − 89
into smaller modules. For example reading and writing files in
+ − 90
Ammonite can be achieved with
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 91
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 92
\begin{lstlisting}[numbers=none,language=Scala]
917
+ − 93
scala> import os._
+ − 94
scala> write.over(pwd / "file.name", "foo bar")
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 95
scala> read(pwd / "file.name")
917
+ − 96
res1: String = "foo bar"
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 97
\end{lstlisting}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 98
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 99
\noindent
917
+ − 100
The second line writes the string \code{"foo bar"} into the file
759
+ − 101
\code{"file.name"}, which is located in the current working
917
+ − 102
directory (\code{pwd}). For loading and accessing code from
+ − 103
another Scala file, you can import the code into Ammonite
+ − 104
as follows:
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 105
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 106
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 107
import $file.name-of-the-file
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 108
import name-of-the-file._
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 109
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 110
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 111
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 112
This assumes the other Scala file is called
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 113
\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
+ − 114
directory where \texttt{amm} is working in. This will be very convenient
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 115
for the compiler we implement in CFL, because it allows us to easily
760
+ − 116
break up the code into the lexer, parser and code generator.
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 117
917
+ − 118
Another handy feature of Ammonite is that you can mark functions as
+ − 119
\texttt{@main}. For example
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 120
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 121
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 122
@main
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 123
def foo() = ...
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 124
\end{lstlisting}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 125
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 126
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 127
This means you can now call that function from the command line like
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 128
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 129
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 130
$ amm file.sc foo
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 131
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 132
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 133
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 134
If you want to specify an argument on the commandline, say an int and
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 135
a string, then you can write
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 136
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 137
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 138
@main
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 139
def bar(i: Int, s: String) = ...
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 140
\end{lstlisting}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 141
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 142
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 143
and then call
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 144
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 145
\begin{lstlisting}[numbers=none,language=Scala]
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 146
$ amm file.sc 42 foobar
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 147
\end{lstlisting} %% $
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 148
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 149
\noindent
917
+ − 150
What is also good in Ammonite is that you can specify more than one
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 151
function to be ``main'' and then specify on the command line which
760
+ − 152
function you want to run as entry-point.
+ − 153
+ − 154
Another feature you might like to use is that Ammonite can ``watch'' files.
+ − 155
This means it can automatically re-run a file when it is saved. For this
+ − 156
you have to call \texttt{amm} with the option \texttt{-w}, as in
+ − 157
+ − 158
\begin{lstlisting}[numbers=none,language=Scala]
+ − 159
$ amm -w file.sc
+ − 160
\end{lstlisting} %% $
+ − 161
+ − 162
\noindent Of course this requires that you use \texttt{println} for
917
+ − 163
inspecting any data as otherwise nothing will be displayed at the
760
+ − 164
commandline.
924
+ − 165
\smallskip
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 166
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 167
\noindent
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 168
To sum up, Ammonite is a really useful addition to the Scala ecosystem.
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 169
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
+ − 170
of the ``Hands-on Scala'' book by Li Haoyi. These chapters are
936
+ − 171
free and can be used as a reference, see
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 172
936
+ − 173
\begin{center}
+ − 174
\url{https://www.handsonscala.com/part-i-introduction-to-scala.html}
+ − 175
\end{center}
754
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 176
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 177
\end{document}
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 178
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 179
%%% Local Variables:
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 180
%%% mode: latex
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 181
%%% TeX-master: t
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff
changeset
+ − 182
%%% End: