handouts/amm-faq.tex
author Christian Urban <christian.urban@kcl.ac.uk>
Fri, 24 Oct 2025 10:45:17 +0100
changeset 1017 b0d44eb1ecc7
parent 1016 c02d409ed7f4
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}
917
89e05a230d2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
     5
\usepackage{tcolorbox}
89e05a230d2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
     6
%% \usepackage[]{hvextern}
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     7
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     8
%cheat sheet
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     9
%http://worldline.github.io/scala-cheatsheet/
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    10
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    11
\begin{document}
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    12
\fnote{\copyright{} Christian Urban, King's College London, 2025}
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    13
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    14
\section*{Ammonite ``Quirks''}
917
89e05a230d2d updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 870
diff changeset
    15
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    16
While Ammonite is great when it comes to additional features, such as
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    17
multiple main's and dynamically loading files, and in the past it was
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    18
a rock-solid piece of software written by one of my Scala-heroes
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    19
(Haoyi Li), it seems it has acquired some ``quirks'' when it
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    20
transitioned to Scala 3. Interestingly, the problems listed below only occur
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    21
inside the REPL. So running Scala-scripts on the command
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    22
line with for example
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    23
1017
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    24
\begin{lstlisting}[language={},numbers=none]
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    25
$ amm cw02.sc
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    26
\end{lstlisting} %% $
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    27
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    28
\noindent
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    29
works fine. Similarly, the original Scala REPL seems to not suffer 
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    30
from these quirks. Unfortunately, this REPL does not allow you to
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    31
dynamically load files which might be relevant in later CWs.
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    32
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    33
\subsection*{Problem with Implicits}
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    34
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    35
In CW2 (and possibly others), if you use the template code and develop
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    36
your code inside the REPL, a problem arises in the line
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    38
\begin{lstlisting}[numbers=none,language=Scala]
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    39
val KEYWORD : Rexp = "while" | "if" | "then" 
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    40
\end{lstlisting}
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    41
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    42
\noindent with the error
760
d41956ea544e updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
    43
d41956ea544e updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 759
diff changeset
    44
\begin{lstlisting}[numbers=none,language=Scala]
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    45
-- [E008] Not Found Error: cmd17.sc:1:36 -----------------------------
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    46
1 |val KEYWORD : Rexp = "while" | "if" | "then" 
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    47
  |                     ^^^^^^^^^^^^^^^^
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    48
  |value | is not a member of ammonite.$sess.cmd4.ALT.
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    49
  |An extension method was tried, but could not be fully constructed:
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    50
  |
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    51
  |    ammonite.$sess.cmd16.|()
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    52
  |
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    53
  |    failed with:
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    54
  |
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    55
  |        value |: <overloaded ammonite.$sess.cmd16.|> does not take 
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    56
  |        parameters
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    57
  |Compilation Failed
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    58
\end{lstlisting}%$\medskip
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    59
994
35db8ee453c0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 965
diff changeset
    60
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    61
\noindent\textbf{Fix:} The code runs absolutely fine when called on the
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    62
commandline. It also runs absolutely fine inside the standard Scala REPL.
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    63
If you prefer to use to use the Ammonite REPL, then you need to make the 
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    64
following changes: (1) comment out the implicits below and change the 
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    65
\code{$} to for example \code{&}%$:
994
35db8ee453c0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 965
diff changeset
    66
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    67
\begin{lstlisting}[numbers=none,language=Scala]
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    68
extension (s: String) {
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    69
  def & (r: Rexp) = RECD(s, r)
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    70
  //def | (r: Rexp) = ALT(s, r)
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    71
  //def | (r: String) = ALT(s, r)
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    72
  //def % = STAR(s)
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    73
  //def ~ (r: Rexp) = SEQ(s, r)
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    74
  //def ~ (r: String) = SEQ(s, r)
994
35db8ee453c0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 965
diff changeset
    75
}
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    76
\end{lstlisting}
994
35db8ee453c0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 965
diff changeset
    77
1016
c02d409ed7f4 added amm faq
Christian Urban <christian.urban@kcl.ac.uk>
parents: 994
diff changeset
    78
\noindent You need to then use \code{&} in the code for the 
1017
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    79
\code{WHILE_REGS}.
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    80
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    81
\subsection*{Problem with Loading Dynamically Files}
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    82
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    83
There seems to be cache problems with loading dynamically files in the REPL.
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    84
For example in the file \code{thompson.sc}, the code for DFAs, NFAs etc is 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    85
loaded using:
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    86
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    87
\begin{lstlisting}[numbers=none,language=Scala]
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    88
import $file.dfa, dfa._ 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    89
import $file.nfa, nfa._
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    90
import $file.enfa, enfa._
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    91
\end{lstlisting}%$
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    92
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    93
\noindent The menace is that all works perfectly in the first REPL session,
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    94
but if you close it and then re-open it for example the next day, you 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    95
receive the following error when you try to re-evaluate the same lines:
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    96
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    97
\begin{lstlisting}[numbers=none,language=Scala]
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    98
-- [E008] Not Found Error: ~/cfl-material/progs/automata/nfa.sc:50:2 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
    99
50 |  dfa
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   100
   |  ^^^
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   101
   |  value dfa is not a member of ammonite.$sess - did you mean $sess.nfa?
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   102
-- [E006] Not Found Error: ~/cfl-material/progs/automata/nfa.sc:6:18 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   103
6 |import $file.$  , dfa._ 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   104
  |                  ^^^
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   105
  |                  Not found: dfa
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   106
  |
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   107
  | longer explanation available when compiling with `-explain`
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   108
Compilation Failed
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   109
\end{lstlisting}%$\medskip
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   110
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   111
\noindent\textbf{Fix:} The code again runs absolutely fine when called on the
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   112
commandline. But the REPL trips over. In this case, the trick with using the 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   113
Scala REPL does not work, because it does not support dynamically loading
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   114
files. However, one ugly fix is to cut-and-paste all the code into a 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   115
single file and then develop this one gigantic file. Or a slightly
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   116
less ugly solution is toi clear out the cache of ammonite. The cache
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   117
on my system is located in 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   118
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   119
\begin{lstlisting}[language={},numbers=none]
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   120
~/.ammonite/cache/3.0.3/
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   121
\end{lstlisting}
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   122
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   123
\noindent
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   124
I usually delete all files inside this directory and in this way force 
b0d44eb1ecc7 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 1016
diff changeset
   125
ammonite to be in a consistent state.
994
35db8ee453c0 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 965
diff changeset
   126
754
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   127
\end{document}
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   128
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   129
%%% Local Variables: 
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   130
%%% mode: latex
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   131
%%% TeX-master: t
1c9a23304b85 ammonite
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
   132
%%% End: