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