--- a/handouts/amm-ho.tex Sat Sep 09 14:14:31 2023 +0100
+++ b/handouts/amm-ho.tex Sun Sep 10 12:24:55 2023 +0100
@@ -2,35 +2,43 @@
\usepackage{../style}
\usepackage{../langs}
\usepackage{marvosym}
+\usepackage{tcolorbox}
+%% \usepackage[]{hvextern}
%cheat sheet
%http://worldline.github.io/scala-cheatsheet/
\begin{document}
-\fnote{\copyright{} Christian Urban, King's College London, 2020, 2021}
+\fnote{\copyright{} Christian Urban, King's College London, 2020, 2021, 2023}
-\section*{Scala in 6CCS3CFL}
+\section*{Scala 3 in 6CCS3CFL}
For the coursework in this module you are free to use any programming
language you like, but I will show you all my code using Scala---I
-hope you have fond memories of Scala from PEP. If you need a reminder
-of the Scala handouts for PEP have a look
-\hr{http://talisker.nms.kcl.ac.uk/cgi-bin/repos.cgi/pep-material/raw-file/tip/handouts/pep-ho.pdf}
-
+hope you have fond memories of Scala from PEP. The only difference
+with PEP is that I will use the current
+stable version of Scala, which at teh time of writing is Scala 3.3.1.
-But as said, you do not need to 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
+\begin{tcolorbox}[colback=red!5!white,colframe=red!75!black]
+If you intend to submit your code for the CW in Scala, you \underline{MUST} submit code that
+is compatible with Scala 3!! This is to make it easier for me to test
+your code and the changes between Scala 2 from last year PEP to Scala
+3 in CFL are not that great. In fact, most changes are just some new
+syntax.
+\end{tcolorbox}\medskip
+
+\noindent
+If you need a reminder of the Scala handouts from PEP updated to Scala 3
+have a look here
+\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
+ been used previously in CFL. I do not recommend to use Java or C or C++ for
writing a compiler, but if you insist, feel free. It has been done
-before.} I will use the
-current stable version of Scala, which is 2.13.6. For various reasons,
-I am NOT GOING TO USE THE LATEST VERSION OF SCALA 3.0! Please be
-aware of this when you run my code.
+ before.}
\bigskip
\noindent
-The main difference to the Scala I showed you in PEP is that in CFL
-I will use the Ammonite REPL
+The other difference between the Scala I showed you in PEP is that in CFL
+I will use the Ammonite REPL (with underlying Scala Version 3):
\begin{quote}
\url{https://ammonite.io/#Ammonite-REPL}
@@ -42,12 +50,15 @@
\begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
$ amm
-Loading...
-Welcome to the Ammonite Repl 2.4.0 (Scala 2.13.6 Java 9)
+Loading...
+Welcome to the Ammonite Repl 2.5.9 (Scala 3.2.2 Java 17.0.7)
scala> 1 + 2
res0: Int = 3
\end{lstlisting} %% $
+%%\runExtCmd[redirect]{ls -la}{voss}
+
+
\noindent
Ammonite uses the same Scala compiler, just adds some useful features
on top of it. It is quite main-stream in the Scala community and it should
@@ -56,30 +67,29 @@
is by using \texttt{curl}:
\begin{lstlisting}[numbers=none,language={},basicstyle=\ttfamily\small]
-$ curl -L https://github.com/com-lihaoyi/Ammonite/
- releases/download/2.4.0/2.13-2.4.0 --output amm
-\end{lstlisting}
+$ curl -L https://github.com/com-lihaoyi/Ammonite/releases/\
+ download/2.5.9/3.2-2.5.9 --output amm
+\end{lstlisting} %% $
-
+\noindent
The big advantage of Ammonite is that it comes with some additional
libraries already built-in and also allows one to easily break up code
into smaller modules. For example reading and writing files in
Ammonite can be achieved with
\begin{lstlisting}[numbers=none,language=Scala]
-scala> import os._
-
+scala> import os._
+scala> write.over(pwd / "file.name", "foo bar")
scala> read(pwd / "file.name")
-res1: String = """..."""
-
-scala> write.over(pwd / "file.name", "foo bar")
+res1: String = "foo bar"
\end{lstlisting}
\noindent
-The latter writes the string \code{"foo bar"} into the file
+The second line writes the string \code{"foo bar"} into the file
\code{"file.name"}, which is located in the current working
-directory. For loading and accessing code from another Scala file, you
-can import it as follows:
+directory (\code{pwd}). For loading and accessing code from
+another Scala file, you can import the code into Ammonite
+as follows:
\begin{lstlisting}[numbers=none,language=Scala]
import $file.name-of-the-file
@@ -93,9 +103,8 @@
for the compiler we implement in CFL, because it allows us to easily
break up the code into the lexer, parser and code generator.
-Another feature which exists in Ammonite, but not yet in the
-current version of Scala (it will be in the next version called dotty)
-is that you can mark functions as \texttt{@main}. For example
+Another handy feature of Ammonite is that you can mark functions as
+\texttt{@main}. For example
\begin{lstlisting}[numbers=none,language=Scala]
@main
@@ -126,7 +135,7 @@
\end{lstlisting} %% $
\noindent
-What is also good in Ammonite that you can specify more than one
+What is also good in Ammonite is that you can specify more than one
function to be ``main'' and then specify on the command line which
function you want to run as entry-point.
@@ -139,7 +148,7 @@
\end{lstlisting} %% $
\noindent Of course this requires that you use \texttt{println} for
-inspecting any data, as otherwise nothing will be displayed at the
+inspecting any data as otherwise nothing will be displayed at the
commandline.
\bigskip