handouts/amm-ho.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Sun, 28 Sep 2025 18:56:01 +0100
changeset 993 29db0cb761c2
parent 964 d3e22099963d
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     1
\documentclass{article}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     2
\usepackage{../style}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     3
\usepackage{../langs}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     4
\usepackage{marvosym}
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
     5
\usepackage{tcolorbox}
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
     6
%% \usepackage[]{hvextern}
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     7
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     8
%cheat sheet
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     9
%http://worldline.github.io/scala-cheatsheet/
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    10
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    11
\begin{document}
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
    12
\fnote{\copyright{} Christian Urban, King's College London, 2020, 2021, 2023, 2025}
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    13
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    14
\section*{Scala 3 in 6CCS3CFL}
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    15
05a51fa5f7bb ammonite
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
cb2918e02806 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 755
diff changeset
    17
language you like, but I will show you all my code using Scala---I
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    18
hope you have fond memories of Scala from PEP. The only difference
964
d3e22099963d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 935
diff changeset
    19
with PEP is that I will the Ammonite REPL for Scala 3.
830
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    20
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    21
\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black]
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    22
If you intend to submit your code for the CW in Scala, you \underline{MUST} submit code that
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    23
is compatible with Scala 3!! This is to make it easier for me to test
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    24
your code and the changes between Scala 2 from last year PEP to Scala
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    25
3 in CFL are not that great. In fact, most changes are just some new
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    26
syntax.
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    27
\end{tcolorbox}\medskip
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    28
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    29
\noindent
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    30
If you need a reminder of the Scala handouts from PEP updated to Scala 3
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    31
have a look here
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
    32
\hr{https://cflmark.nms.kcl.ac.uk/hg/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
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    33
  been used previously in CFL. I do not recommend to use Java or C or C++ for
830
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    34
  writing a compiler, but if you insist, feel free. It has been done
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    35
  before.}  
830
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    36
\bigskip
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    38
\noindent
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    39
The other difference between the Scala I showed you in PEP is that in CFL
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    40
I will use the Ammonite REPL (with underlying Scala Version 3):
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    41
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    42
\begin{quote}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    43
\url{https://ammonite.io/#Ammonite-REPL}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    44
\end{quote}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    45
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    46
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    47
This is a drop-in replacement for the original Scala REPL and
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    48
works very similarly, for example
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    49
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    50
\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    51
$ amm
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    52
Loading...
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
    53
Welcome to the Ammonite Repl 3.0.2 (Scala 3.3.5 Java 21.0.8)
964
d3e22099963d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 935
diff changeset
    54
@ 1 + 2
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    55
res0: Int = 3
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    56
\end{lstlisting} %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    57
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    58
%%\runExtCmd[redirect]{ls -la}{voss}
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    59
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    60
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    61
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    62
Ammonite uses the same Scala compiler, just adds some useful features
05a51fa5f7bb ammonite
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
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    64
therefore be very easy for you to install \texttt{amm}. If you work under
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    65
a Unix-like system, a sure way to install the right version of Ammonite
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    66
is by using \texttt{curl}:
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    67
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    68
\begin{lstlisting}[numbers=none,language={},basicstyle=\ttfamily\small]
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    69
$ curl -L https://github.com/com-lihaoyi/Ammonite/releases/\
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
    70
  download/3.0.2/3.5-3.0.2 --output amm
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    71
\end{lstlisting} %% $  
838
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    72
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    73
\noindent
923
a46034ce7be2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 917
diff changeset
    74
This creates a file \code{amm} which before it can be run might
935
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    75
need some adjustments of the permissions. Under recent versions of
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    76
Windows also have \texttt{curl}, but need a slightly different call:
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    77
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    78
\begin{lstlisting}[numbers=none,language={},basicstyle=\ttfamily\small]
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    79
$ curl -L https://github.com/com-lihaoyi/Ammonite/releases/\
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
    80
   download/3.0.2/3.5-3.0.2 --output amm.bat
935
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    81
\end{lstlisting} %% $  
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    82
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    83
\noindent
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    84
Then you need to run Ammonite with \texttt{.$\backslash$amm} and there
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    85
is no need to change any permissions under Windows.  
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
    86
759
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    87
The big advantage of Ammonite is that it comes with some additional
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    88
libraries already built-in and also allows one to easily break up code
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    89
into smaller modules. For example reading and writing files in
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    90
Ammonite can be achieved with
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    91
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    92
\begin{lstlisting}[numbers=none,language=Scala]
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    93
scala> import os._
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    94
scala> write.over(pwd / "file.name", "foo bar")  
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    95
scala> read(pwd / "file.name")   
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    96
res1: String = "foo bar"
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    97
\end{lstlisting}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    98
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    99
\noindent
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
   100
The second line writes the string \code{"foo bar"} into the file
759
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
   101
\code{"file.name"}, which is located in the current working
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   102
directory (\code{pwd}). We want to implement a compiler---therefore 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   103
reading and writing files will come in handy.
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   104
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   105
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   106
For loading and accessing code from
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
   107
another Scala file, you can import the code into Ammonite
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
   108
as follows:
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   109
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   110
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   111
import $file.name-of-the-file
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   112
import name-of-the-file._
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   113
\end{lstlisting}  %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   114
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   115
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   116
This assumes the other Scala file is called
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   117
\texttt{name-of-the-file.sc} and requires the file to be in the same
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   118
directory where \texttt{amm} is working in. Again this will be very convenient 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   119
for our compiler we implement in CFL, because it allows us to easily
760
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   120
break up the code into the lexer, parser and code generator.
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   121
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
   122
Another handy feature of Ammonite is that you can mark functions as
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
   123
\texttt{@main}. For example
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   124
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   125
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   126
@main
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   127
def foo() = ...
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   128
\end{lstlisting}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   129
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   130
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   131
This means you can now call that function from the command line like
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   132
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   133
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   134
$ amm file.sc foo
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   135
\end{lstlisting} %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   136
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   137
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   138
If you want to specify an argument on the commandline, say an int and
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   139
a string, then you can write
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   140
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   141
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   142
@main
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   143
def bar(i: Int, s: String) = ...
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   144
\end{lstlisting}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   145
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   146
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   147
and then call
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   148
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   149
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   150
$ amm file.sc 42 foobar
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   151
\end{lstlisting} %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   152
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   153
\noindent
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
   154
What is also good in Ammonite is that you can specify more than one
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   155
function to be ``main'' and then specify on the command line which
760
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   156
function you want to run as entry-point.
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   157
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   158
Another feature you might like to use is that Ammonite can ``watch'' files.
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   159
This means it can automatically re-run a file when it is saved. For this
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   160
you have to call \texttt{amm} with the option \texttt{-w}, as in
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   161
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   162
\begin{lstlisting}[numbers=none,language=Scala]
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   163
$ amm -w file.sc
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   164
\end{lstlisting} %% $
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   165
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   166
\noindent Of course this requires that you use \texttt{println} for
917
d3d371ae5fab updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
   167
inspecting any data as otherwise nothing will be displayed at the
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   168
commandline.\medskip
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   169
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   170
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   171
To sum up, Ammonite is a really useful addition to the Scala ecosystem.
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   172
You can find more information about how to use it in the first five chapters
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   173
of the ``Hands-on Scala'' book by Li Haoyi. These chapters are
935
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
   174
free and can be used as a reference, see
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   175
935
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
   176
\begin{center}
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
   177
\url{https://www.handsonscala.com/part-i-introduction-to-scala.html}
3fb9b05465dd updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 923
diff changeset
   178
\end{center}
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   179
993
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   180
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   181
\subsection*{Some Updates in Scala 3 and the Videos}
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   182
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   183
While Scala 2 and Scala 3 code is on the whole quite compatible, there are some
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   184
corners where my Scala 3 code differs from the code shown in the videos. I am still
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   185
fond of using \texttt{\{...\}} rather than Pythonesque indentation syntax. But
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   186
I switched to the \texttt{enum}-syntax for abstract datatypes. Defining regular
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   187
expressions in the ``old'' way can be done using abstract classes, like:
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   188
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   189
\begin{lstlisting}[language=Scala,basicstyle=\ttfamily\small]
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   190
abstract class Rexp
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   191
case object ZERO extends Rexp
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   192
case object ONE extends Rexp
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   193
case class CHAR(c: Char) extends Rexp
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   194
case class ALT(r1: Rexp, r2: Rexp) extends Rexp
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   195
case class SEQ(r1: Rexp, r2: Rexp) extends Rexp
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   196
case class STAR(r: Rexp) extends Rexp
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   197
\end{lstlisting} 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   198
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   199
\noindent
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   200
While this code still works in Scala 3 as expected, the definition can now 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   201
be simplified to:
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   202
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   203
\begin{lstlisting}[language=Scala,basicstyle=\ttfamily\small]
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   204
enum Rexp {
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   205
  case ZERO                     
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   206
  case ONE                      
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   207
  case CHAR(c: Char)            
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   208
  case ALT(r1: Rexp, r2: Rexp)  
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   209
  case SEQ(r1: Rexp, r2: Rexp)  
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   210
  case STAR(r: Rexp)            
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   211
}
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   212
import Rexp._
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   213
\end{lstlisting} 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   214
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   215
\noindent
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   216
Note that the syntax with \texttt{enum} needs an import, otherwise you need
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   217
to refer to the constructors slightly clumsily as in \texttt{Rexp.CHAR('a')} and 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   218
so on.
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   219
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   220
Also implicits are now defined differently in Scala 3 and need to be
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   221
split up into \texttt{given}s and extension methods. If you want to
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   222
construct regular expressions using strings, for example \texttt{STAR("a")},
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   223
then you need to declare a \texttt{given}-clause:
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   224
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   225
\begin{lstlisting}[language=Scala,basicstyle=\ttfamily\small]
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   226
def charlist2rexp(s : List[Char]): Rexp = s match {
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   227
  case Nil => ONE
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   228
  case c::Nil => CHAR(c)
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   229
  case c::s => SEQ(CHAR(c), charlist2rexp(s))
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   230
}
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   231
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   232
given Conversion[String, Rexp] = (s => charlist2rexp(s.toList))
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   233
\end{lstlisting} 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   234
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   235
\noindent
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   236
This uses the auxiliary function \texttt{charlist2rexp} which translates
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   237
a string (list of chars) into a regular expression. The ``magic'' is then 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   238
installed in the \texttt{given}-clause which calls \texttt{charlist2rexp} 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   239
whenever a \texttt{Rexp} is expected, but a string is given.
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   240
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   241
More convenient operator syntax for regular instructions needs to be
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   242
defined in Scala 3 as \emph{extension method}. For example, the shorthand-syntax
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   243
for alternatives, sequences and stars needs to be defined as:
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   244
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   245
\begin{lstlisting}[language=Scala,basicstyle=\ttfamily\small]
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   246
extension (r: Rexp) {
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   247
  def | (s: Rexp) = ALT(r, s)
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   248
  def ~ (s: Rexp) = SEQ(r, s)
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   249
  def % = STAR(r)
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   250
}
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   251
\end{lstlisting} 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   252
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   253
\noindent
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   254
After that you can define regular expressions more conveniently
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   255
as \pcode{"ab" | "bc"}, \pcode{"ab" ~ "bc"} or \pcode{"ab".\%}\;.\medskip
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   256
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   257
\noindent
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   258
To sum up, it should be easy for you to translate the old syntax that
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   259
is in some places used in the videos and the newer syntax used in the
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   260
uploaded files. There are a few additional rough edges in the code
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   261
for parsers, but I will mention them nearer the time. 
29db0cb761c2 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 964
diff changeset
   262
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   263
\end{document}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   264
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   265
%%% Local Variables: 
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   266
%%% mode: latex
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   267
%%% TeX-master: t
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   268
%%% End: