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
  | 
| 
964
 | 
    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...
  | 
| 
964
 | 
    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/\
  | 
| 
964
 | 
    70  | 
  download/3.0.0-M2/3.3-3.0.0-M2 --output amm
  | 
| 
917
 | 
    71  | 
\end{lstlisting} %% $  
 | 
| 
838
 | 
    72  | 
  | 
| 
917
 | 
    73  | 
\noindent
  | 
| 
923
 | 
    74  | 
This creates a file \code{amm} which before it can be run might
 | 
| 
935
 | 
    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/\
  | 
| 
964
 | 
    80  | 
  download/3.0.0-M2/3.3-3.0.0-M2 --output amm.bat
  | 
| 
935
 | 
    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.
  | 
| 
923
 | 
   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
  | 
| 
935
 | 
   171  | 
free and can be used as a reference, see
  | 
754
Christian Urban <christian.urban@kcl.ac.uk> 
parents:  
diff
changeset
 
 | 
   172  | 
  | 
| 
935
 | 
   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: 
  |