handouts/amm-ho.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Mon, 07 Sep 2020 12:27:08 +0100
changeset 755 37b69593994c
parent 754 1c9a23304b85
child 756 f7c7a75e0583
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     1
\documentclass{article}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     2
\usepackage{../style}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     3
\usepackage{../langs}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     4
\usepackage{marvosym}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     5
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     6
%cheat sheet
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     7
%http://worldline.github.io/scala-cheatsheet/
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     8
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     9
\begin{document}
755
37b69593994c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 754
diff changeset
    10
\fnote{\copyright{} Christian Urban, King's College London, 2020}
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    11
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    12
\section*{Scala in 6CCS3CFL}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    13
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    14
For the coursework in this module you are free to use any programming
1c9a23304b85 ammonite
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
37b69593994c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 754
diff changeset
    16
you have fond memories of Scala from PEP. But as said, you do not need to
37b69593994c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 754
diff changeset
    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
37b69593994c updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 754
diff changeset
    18
a compiler, but if you insist, nothing I can do.}  I will use the current
754
1c9a23304b85 ammonite
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
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    20
the Scala handouts for PEP have a look
1c9a23304b85 ammonite
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
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    22
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    23
\noindent
1c9a23304b85 ammonite
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
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    25
I will use the Ammonite REPL
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    26
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    27
\begin{quote}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    28
\url{https://ammonite.io/#Ammonite-REPL}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    29
\end{quote}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    30
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    31
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    32
This is a drop-in replacement for the original Scala REPL and
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    33
works very similarly, for example
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    34
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    35
\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    36
$ amm
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
Loading...  
1c9a23304b85 ammonite
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)
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    39
scala> 1 + 2 
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    40
res0: Int = 3
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    41
\end{lstlisting} %% $
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    42
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    43
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    44
Ammonite uses the same Scala compiler, just adds some useful features
1c9a23304b85 ammonite
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
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    46
therefore be very easy for you to install \texttt{amm}.  The big
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    47
advantage of Ammonite is that it comes with some additional libraries
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    48
already built-in and also allows one to easily break up code into
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    49
smaller modules. For example reading and writing files in Ammonite can
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    50
be achieved with
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    51
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    52
\begin{lstlisting}[numbers=none,language=Scala]
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    53
scala> import ammonite.ops._
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    54
  
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    55
scala> read(pwd / "file.name")   
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    56
res1: String = """..."""
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    57
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    58
scala> write.over(pwd / "file.name", "foo bar")
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    59
\end{lstlisting}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    60
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    61
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    62
For loading and accessing code from another Scala file, you can import it
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    63
as follows:
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    64
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    65
\begin{lstlisting}[numbers=none,language=Scala]
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    66
import $file.name-of-the-file
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    67
import name-of-the-file._
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    68
\end{lstlisting}  %% $
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    69
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    70
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    71
This assumes the other Scala file is called
1c9a23304b85 ammonite
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
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    73
directory where \texttt{amm} is working in. This will be very convenient 
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    74
for the compiler we implement in CFL, because it allows us to easily
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    75
break-up the code into the lexer, parser and code generator.
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    76
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    77
Another feature which exists in Ammonite, but not yet in the
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    78
current version of Scala (it will be in the next version called dotty)
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    79
is that you can mark functions as \texttt{@main}. For example
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    80
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    81
\begin{lstlisting}[numbers=none,language=Scala]
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    82
@main
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    83
def foo() = ...
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    84
\end{lstlisting}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    85
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    86
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    87
This means you can now call that function from the command line like
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    88
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    89
\begin{lstlisting}[numbers=none,language=Scala]
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    90
$ amm file.sc foo
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    91
\end{lstlisting} %% $
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    92
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    93
\noindent
1c9a23304b85 ammonite
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
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    95
a string, then you can write
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    96
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    97
\begin{lstlisting}[numbers=none,language=Scala]
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    98
@main
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    99
def bar(i: Int, s: String) = ...
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   100
\end{lstlisting}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   101
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   102
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   103
and then call
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   104
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   105
\begin{lstlisting}[numbers=none,language=Scala]
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   106
$ amm file.sc 42 foobar
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   107
\end{lstlisting} %% $
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   108
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   109
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   110
What is also good in Ammonite that you can specify more than one
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   111
function to be ``main'' and then specify on the command line which
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   112
function do you want to run as entry-point.\bigskip
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   113
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   114
\noindent
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   115
To sum up, Ammonite is a really useful addition to the Scala ecosystem.
1c9a23304b85 ammonite
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
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   117
of the ``Hands-on Scala'' book by Li Haoyi. These chapters are
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   118
free and can be used as a reference, see:
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   119
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   120
\begin{center}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   121
\url{https://www.handsonscala.com/part-i-introduction-to-scala.html}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   122
\end{center}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   123
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   124
\end{document}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   125
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   126
%%% Local Variables: 
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   127
%%% mode: latex
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   128
%%% TeX-master: t
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   129
%%% End: