handouts/amm-ho.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Mon, 24 Jan 2022 00:14:02 +0000
changeset 870 1ea379515c6d
parent 869 16247acc4b0e
child 917 d3d371ae5fab
permissions -rw-r--r--
ivy import not needed
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}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     5
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     6
%cheat sheet
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     7
%http://worldline.github.io/scala-cheatsheet/
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     8
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     9
\begin{document}
838
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    10
\fnote{\copyright{} Christian Urban, King's College London, 2020, 2021}
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    11
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    12
\section*{Scala in 6CCS3CFL}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    13
05a51fa5f7bb 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
756
cb2918e02806 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 755
diff changeset
    15
language you like, but I will show you all my code using Scala---I
830
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    16
hope you have fond memories of Scala from PEP. If you need a reminder
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    17
of the Scala handouts for PEP have a look
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    18
\hr{http://talisker.nms.kcl.ac.uk/cgi-bin/repos.cgi/pep-material/raw-file/tip/handouts/pep-ho.pdf}
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    19
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    20
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    21
But as said, you do not need to use Scala for your own
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    22
code.\footnote{Haskell, Rust, Ocaml were other languages that have
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    23
  been used previously in CFL. I recommend to not use Java or C for
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    24
  writing a compiler, but if you insist, feel free. It has been done
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    25
before.}  I will use the
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    26
current stable version of Scala, which is 2.13.6. For various reasons,
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    27
I am NOT GOING TO USE THE LATEST VERSION OF SCALA 3.0! Please be
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    28
aware of this when you run my code.
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    29
\bigskip
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    30
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    31
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    32
The main difference to the Scala I showed you in PEP is that in CFL
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    33
I will use the Ammonite REPL
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    34
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    35
\begin{quote}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    36
\url{https://ammonite.io/#Ammonite-REPL}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
\end{quote}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    38
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    39
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    40
This is a drop-in replacement for the original Scala REPL and
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    41
works very similarly, for example
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    42
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    43
\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    44
$ amm
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    45
Loading...  
838
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    46
Welcome to the Ammonite Repl 2.4.0 (Scala 2.13.6 Java 9)
830
c602edae2978 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 760
diff changeset
    47
scala> 1 + 2
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    48
res0: Int = 3
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    49
\end{lstlisting} %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    50
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    51
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    52
Ammonite uses the same Scala compiler, just adds some useful features
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    53
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
    54
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
    55
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
    56
is by using \texttt{curl}:
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    57
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    58
\begin{lstlisting}[numbers=none,language={},basicstyle=\ttfamily\small]
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    59
$ curl -L https://github.com/com-lihaoyi/Ammonite/
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    60
                 releases/download/2.4.0/2.13-2.4.0 --output amm
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    61
\end{lstlisting}  
113230908e2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 830
diff changeset
    62
759
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    63
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    64
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
    65
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
    66
into smaller modules. For example reading and writing files in
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    67
Ammonite can be achieved with
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    68
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    69
\begin{lstlisting}[numbers=none,language=Scala]
869
16247acc4b0e changed os-lib as a replacement for ammonite-ops
Christian Urban <christian.urban@kcl.ac.uk>
parents: 838
diff changeset
    70
scala> import os._  
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    71
  
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    72
scala> read(pwd / "file.name")   
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    73
res1: String = """..."""
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    74
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    75
scala> write.over(pwd / "file.name", "foo bar")
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    76
\end{lstlisting}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    77
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    78
\noindent
759
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    79
The latter writes the string \code{"foo bar"} into the file
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    80
\code{"file.name"}, which is located in the current working
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    81
directory. For loading and accessing code from another Scala file, you
636ad159b4eb updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 756
diff changeset
    82
can import it as follows:
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    83
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    84
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    85
import $file.name-of-the-file
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    86
import name-of-the-file._
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    87
\end{lstlisting}  %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    88
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    89
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    90
This assumes the other Scala file is called
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    91
\texttt{name-of-the-file.sc} and requires the file to be in the same
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    92
directory where \texttt{amm} is working in. This will be very convenient 
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    93
for the 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
    94
break up the code into the lexer, parser and code generator.
754
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    95
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    96
Another feature which exists in Ammonite, but not yet in the
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    97
current version of Scala (it will be in the next version called dotty)
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    98
is that you can mark functions as \texttt{@main}. For example
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    99
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   100
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   101
@main
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   102
def foo() = ...
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   103
\end{lstlisting}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   104
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   105
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   106
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
   107
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   108
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   109
$ amm file.sc foo
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   110
\end{lstlisting} %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   111
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   112
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   113
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
   114
a string, then you can write
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   115
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   116
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   117
@main
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   118
def bar(i: Int, s: String) = ...
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   119
\end{lstlisting}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   120
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   121
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   122
and then call
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   123
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   124
\begin{lstlisting}[numbers=none,language=Scala]
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   125
$ amm file.sc 42 foobar
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   126
\end{lstlisting} %% $
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   127
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   128
\noindent
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   129
What is also good in Ammonite that you can specify more than one
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   130
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
   131
function you want to run as entry-point.
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   132
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   133
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
   134
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
   135
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
   136
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   137
\begin{lstlisting}[numbers=none,language=Scala]
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   138
$ amm -w file.sc
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   139
\end{lstlisting} %% $
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   140
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   141
\noindent Of course this requires that you use \texttt{println} for
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   142
inspecting any data, as otherwise nothing will be displayed at the
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   143
commandline.
e11aa9bf2600 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
   144
\bigskip
754
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
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
   148
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
   149
of the ``Hands-on Scala'' book by Li Haoyi. These chapters are
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   150
free and can be used as a reference, see:
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   151
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   152
\begin{center}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   153
\url{https://www.handsonscala.com/part-i-introduction-to-scala.html}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   154
\end{center}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   155
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   156
\end{document}
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   157
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   158
%%% Local Variables: 
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   159
%%% mode: latex
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   160
%%% TeX-master: t
05a51fa5f7bb ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   161
%%% End: