handouts/amm-ho.tex
changeset 754 1c9a23304b85
child 755 37b69593994c
equal deleted inserted replaced
753:d94fdbef1a4f 754:1c9a23304b85
       
     1 \documentclass{article}
       
     2 \usepackage{../style}
       
     3 \usepackage{../langs}
       
     4 \usepackage{marvosym}
       
     5 
       
     6 %cheat sheet
       
     7 %http://worldline.github.io/scala-cheatsheet/
       
     8 
       
     9 \begin{document}
       
    10 
       
    11 \section*{Scala in 6CCS3CFL}
       
    12 
       
    13 For the coursework in this module you are free to use any programming
       
    14 language you like, but I will show you all my code using Scala---I hope
       
    15 you have fond memories of Scala from PEP. I will use the current
       
    16 stable version of Scala, which is 2.13.3. If you need a reminder of
       
    17 the Scala handouts for PEP have a look
       
    18 \hr{http://talisker.nms.kcl.ac.uk/cgi-bin/repos.cgi/pep-material/raw-file/tip/handouts/pep-ho.pdf}\bigskip
       
    19 
       
    20 \noindent
       
    21 The main difference to the Scala I showed you in PEP is that in CFL
       
    22 I will use the Ammonite REPL
       
    23 
       
    24 \begin{quote}
       
    25 \url{https://ammonite.io/#Ammonite-REPL}
       
    26 \end{quote}
       
    27 
       
    28 \noindent
       
    29 This is a drop-in replacement for the original Scala REPL and
       
    30 works very similarly, for example
       
    31 
       
    32 \begin{lstlisting}[language={},numbers=none,basicstyle=\ttfamily\small]
       
    33 $ amm
       
    34 Loading...  
       
    35 Welcome to the Ammonite Repl 2.2.0 (Scala 2.13.3 Java 9)
       
    36 scala> 1 + 2 
       
    37 res0: Int = 3
       
    38 \end{lstlisting} %% $
       
    39 
       
    40 \noindent
       
    41 Ammonite uses the same Scala compiler, just adds some useful features
       
    42 on top of it. It is quite main-stream in the Scala community and it should
       
    43 therefore be very easy for you to install \texttt{amm}.  The big
       
    44 advantage of Ammonite is that it comes with some additional libraries
       
    45 already built-in and also allows one to easily break up code into
       
    46 smaller modules. For example reading and writing files in Ammonite can
       
    47 be achieved with
       
    48 
       
    49 \begin{lstlisting}[numbers=none,language=Scala]
       
    50 scala> import ammonite.ops._
       
    51   
       
    52 scala> read(pwd / "file.name")   
       
    53 res1: String = """..."""
       
    54 
       
    55 scala> write.over(pwd / "file.name", "foo bar")
       
    56 \end{lstlisting}
       
    57 
       
    58 \noindent
       
    59 For loading and accessing code from another Scala file, you can import it
       
    60 as follows:
       
    61 
       
    62 \begin{lstlisting}[numbers=none,language=Scala]
       
    63 import $file.name-of-the-file
       
    64 import name-of-the-file._
       
    65 \end{lstlisting}  %% $
       
    66 
       
    67 \noindent
       
    68 This assumes the other Scala file is called
       
    69 \texttt{name-of-the-file.sc} and requires the file to be in the same
       
    70 directory where \texttt{amm} is working in. This will be very convenient 
       
    71 for the compiler we implement in CFL, because it allows us to easily
       
    72 break-up the code into the lexer, parser and code generator.
       
    73 
       
    74 Another feature which exists in Ammonite, but not yet in the
       
    75 current version of Scala (it will be in the next version called dotty)
       
    76 is that you can mark functions as \texttt{@main}. For example
       
    77 
       
    78 \begin{lstlisting}[numbers=none,language=Scala]
       
    79 @main
       
    80 def foo() = ...
       
    81 \end{lstlisting}
       
    82 
       
    83 \noindent
       
    84 This means you can now call that function from the command line like
       
    85 
       
    86 \begin{lstlisting}[numbers=none,language=Scala]
       
    87 $ amm file.sc foo
       
    88 \end{lstlisting} %% $
       
    89 
       
    90 \noindent
       
    91 If you want to specify an argument on the commandline, say an int and
       
    92 a string, then you can write
       
    93 
       
    94 \begin{lstlisting}[numbers=none,language=Scala]
       
    95 @main
       
    96 def bar(i: Int, s: String) = ...
       
    97 \end{lstlisting}
       
    98 
       
    99 \noindent
       
   100 and then call
       
   101 
       
   102 \begin{lstlisting}[numbers=none,language=Scala]
       
   103 $ amm file.sc 42 foobar
       
   104 \end{lstlisting} %% $
       
   105 
       
   106 \noindent
       
   107 What is also good in Ammonite that you can specify more than one
       
   108 function to be ``main'' and then specify on the command line which
       
   109 function do you want to run as entry-point.\bigskip
       
   110 
       
   111 \noindent
       
   112 To sum up, Ammonite is a really useful addition to the Scala ecosystem.
       
   113 You can find more information about how to use it in the first five chapters
       
   114 of the ``Hands-on Scala'' book by Li Haoyi. These chapters are
       
   115 free and can be used as a reference, see:
       
   116 
       
   117 \begin{center}
       
   118 \url{https://www.handsonscala.com/part-i-introduction-to-scala.html}
       
   119 \end{center}
       
   120 
       
   121 \end{document}
       
   122 
       
   123 %%% Local Variables: 
       
   124 %%% mode: latex
       
   125 %%% TeX-master: t
       
   126 %%% End: