| 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
 | 
| 756 |     15 | language you like, but I will show you all my code using Scala---I
 | 
|  |     16 | hope you have fond memories of Scala from PEP. But as said, you do not
 | 
|  |     17 | need to use Scala for your own code.\footnote{Haskell, Rust, Ocaml
 | 
|  |     18 |   were other languages that have been used previously in CFL. I
 | 
|  |     19 |   recommend to not use Java or C for writing a compiler, but if you
 | 
|  |     20 |   insist, feel free.}  I will use the current stable version of
 | 
|  |     21 | Scala, which is 2.13.3. If you need a reminder of the Scala handouts
 | 
|  |     22 | for PEP have a look
 | 
| 754 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     23 | \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 |     24 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     25 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     26 | 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 |     27 | I will use the Ammonite REPL
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     28 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     29 | \begin{quote}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     30 | \url{https://ammonite.io/#Ammonite-REPL}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     31 | \end{quote}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     32 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     33 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     34 | This is a drop-in replacement for the original Scala REPL and
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     35 | works very similarly, for example
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     36 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     37 | \begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     38 | $ amm
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     39 | Loading...  
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     40 | Welcome to the Ammonite Repl 2.2.0 (Scala 2.13.3 Java 9)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     41 | scala> 1 + 2 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     42 | res0: Int = 3
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     43 | \end{lstlisting} %% $
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     44 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     45 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     46 | Ammonite uses the same Scala compiler, just adds some useful features
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     47 | on top of it. It is quite main-stream in the Scala community and it should
 | 
| 759 |     48 | therefore be very easy for you to install \texttt{amm}.
 | 
|  |     49 | 
 | 
|  |     50 | The big advantage of Ammonite is that it comes with some additional
 | 
|  |     51 | libraries already built-in and also allows one to easily break up code
 | 
|  |     52 | into smaller modules. For example reading and writing files in
 | 
|  |     53 | Ammonite can be achieved with
 | 
| 754 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     54 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     55 | \begin{lstlisting}[numbers=none,language=Scala]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     56 | scala> import ammonite.ops._
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     57 |   
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     58 | scala> read(pwd / "file.name")   
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     59 | res1: String = """..."""
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     60 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     61 | scala> write.over(pwd / "file.name", "foo bar")
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     62 | \end{lstlisting}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     63 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     64 | \noindent
 | 
| 759 |     65 | The latter writes the string \code{"foo bar"} into the file
 | 
|  |     66 | \code{"file.name"}, which is located in the current working
 | 
|  |     67 | directory. For loading and accessing code from another Scala file, you
 | 
|  |     68 | can import it as follows:
 | 
| 754 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     69 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     70 | \begin{lstlisting}[numbers=none,language=Scala]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     71 | import $file.name-of-the-file
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     72 | import name-of-the-file._
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     73 | \end{lstlisting}  %% $
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     74 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     75 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     76 | This assumes the other Scala file is called
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     77 | \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 |     78 | directory where \texttt{amm} is working in. This will be very convenient 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     79 | for the compiler we implement in CFL, because it allows us to easily
 | 
| 760 |     80 | break up the code into the lexer, parser and code generator.
 | 
| 754 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     81 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     82 | Another feature which exists in Ammonite, but not yet in the
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     83 | current version of Scala (it will be in the next version called dotty)
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     84 | is that you can mark functions as \texttt{@main}. For example
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     85 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     86 | \begin{lstlisting}[numbers=none,language=Scala]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     87 | @main
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     88 | def foo() = ...
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     89 | \end{lstlisting}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     90 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     91 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     92 | This means you can now call that function from the command line like
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     93 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     94 | \begin{lstlisting}[numbers=none,language=Scala]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     95 | $ amm file.sc foo
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     96 | \end{lstlisting} %% $
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     97 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     98 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |     99 | If you want to specify an argument on the commandline, say an int and
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    100 | a string, then you can write
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    101 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    102 | \begin{lstlisting}[numbers=none,language=Scala]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    103 | @main
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    104 | def bar(i: Int, s: String) = ...
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    105 | \end{lstlisting}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    106 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    107 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    108 | and then call
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    109 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    110 | \begin{lstlisting}[numbers=none,language=Scala]
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    111 | $ amm file.sc 42 foobar
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    112 | \end{lstlisting} %% $
 | 
| 
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 | What is also good in Ammonite that you can specify more than one
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    116 | function to be ``main'' and then specify on the command line which
 | 
| 760 |    117 | function you want to run as entry-point.
 | 
|  |    118 | 
 | 
|  |    119 | Another feature you might like to use is that Ammonite can ``watch'' files.
 | 
|  |    120 | This means it can automatically re-run a file when it is saved. For this
 | 
|  |    121 | you have to call \texttt{amm} with the option \texttt{-w}, as in
 | 
|  |    122 | 
 | 
|  |    123 | \begin{lstlisting}[numbers=none,language=Scala]
 | 
|  |    124 | $ amm -w file.sc
 | 
|  |    125 | \end{lstlisting} %% $
 | 
|  |    126 | 
 | 
|  |    127 | \noindent Of course this requires that you use \texttt{println} for
 | 
|  |    128 | inspecting any data, as otherwise nothing will be displayed at the
 | 
|  |    129 | commandline.
 | 
|  |    130 | \bigskip
 | 
| 754 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    131 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    132 | \noindent
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    133 | To sum up, Ammonite is a really useful addition to the Scala ecosystem.
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    134 | 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 |    135 | of the ``Hands-on Scala'' book by Li Haoyi. These chapters are
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    136 | free and can be used as a reference, see:
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    137 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    138 | \begin{center}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    139 | \url{https://www.handsonscala.com/part-i-introduction-to-scala.html}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    140 | \end{center}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    141 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    142 | \end{document}
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    143 | 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    144 | %%% Local Variables: 
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    145 | %%% mode: latex
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    146 | %%% TeX-master: t
 | 
| 
Christian Urban <christian.urban@kcl.ac.uk> parents: diff
changeset |    147 | %%% End: 
 |