\documentclass[10pt,a4paper]{article} % Packages \usepackage{fancyhdr} % For header and footer \usepackage{multicol} % Allows multicols in tables \usepackage{tabularx} % Intelligent column widths \usepackage{tabulary} % Used in header and footer \usepackage{hhline} % Border under tables \usepackage{graphicx} % For images \usepackage{xcolor} % For hex colours %\usepackage[utf8x]{inputenc} % For unicode character support \usepackage[T1]{fontenc} % Without this we get weird character replacements \usepackage{colortbl} % For coloured tables \usepackage{setspace} % For line height \usepackage{lastpage} % Needed for total page number \usepackage{seqsplit} % Splits long words. %\usepackage{opensans} % Can't make this work so far. Shame. Would be lovely. \usepackage[normalem]{ulem} % For underlining links % Most of the following are not required for the majority % of cheat sheets but are needed for some symbol support. \usepackage{amsmath} % Symbols \usepackage{MnSymbol} % Symbols \usepackage{wasysym} % Symbols %\usepackage[english,german,french,spanish,italian]{babel} % Languages % Document Info \author{anatoliykmetyuk} \pdfinfo{ /Title (subscript.pdf) /Creator (Cheatography) /Author (anatoliykmetyuk) /Subject (SubScript Cheat Sheet) } % Lengths and widths \addtolength{\textwidth}{6cm} \addtolength{\textheight}{-1cm} \addtolength{\hoffset}{-3cm} \addtolength{\voffset}{-2cm} \setlength{\tabcolsep}{0.2cm} % Space between columns \setlength{\headsep}{-12pt} % Reduce space between header and content \setlength{\headheight}{85pt} % If less, LaTeX automatically increases it \renewcommand{\footrulewidth}{0pt} % Remove footer line \renewcommand{\headrulewidth}{0pt} % Remove header line \renewcommand{\seqinsert}{\ifmmode\allowbreak\else\-\fi} % Hyphens in seqsplit % This two commands together give roughly % the right line height in the tables \renewcommand{\arraystretch}{1.3} \onehalfspacing % Commands \newcommand{\SetRowColor}[1]{\noalign{\gdef\RowColorName{#1}}\rowcolor{\RowColorName}} % Shortcut for row colour \newcommand{\mymulticolumn}[3]{\multicolumn{#1}{>{\columncolor{\RowColorName}}#2}{#3}} % For coloured multi-cols \newcolumntype{x}[1]{>{\raggedright}p{#1}} % New column types for ragged-right paragraph columns \newcommand{\tn}{\tabularnewline} % Required as custom column type in use % Font and Colours \definecolor{HeadBackground}{HTML}{333333} \definecolor{FootBackground}{HTML}{666666} \definecolor{TextColor}{HTML}{333333} \definecolor{DarkBackground}{HTML}{FFB300} \definecolor{LightBackground}{HTML}{FFFAEF} \renewcommand{\familydefault}{\sfdefault} \color{TextColor} % Header and Footer \pagestyle{fancy} \fancyhead{} % Set header to blank \fancyfoot{} % Set footer to blank \fancyhead[L]{ \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{C} \SetRowColor{DarkBackground} \vspace{-7pt} {\parbox{\dimexpr\textwidth-2\fboxsep\relax}{\noindent \hspace*{-6pt}\includegraphics[width=5.8cm]{/web/www.cheatography.com/public/images/cheatography_logo.pdf}} } \end{tabulary} \columnbreak \begin{tabulary}{11cm}{L} \vspace{-2pt}\large{\bf{\textcolor{DarkBackground}{\textrm{SubScript Cheat Sheet}}}} \\ \normalsize{by \textcolor{DarkBackground}{anatoliykmetyuk} via \textcolor{DarkBackground}{\uline{cheatography.com/25536/cs/6718/}}} \end{tabulary} \end{multicols}} \fancyfoot[L]{ \footnotesize \noindent \begin{multicols}{3} \begin{tabulary}{5.8cm}{LL} \SetRowColor{FootBackground} \mymulticolumn{2}{p{5.377cm}}{\bf\textcolor{white}{Cheatographer}} \\ \vspace{-2pt}anatoliykmetyuk \\ \uline{cheatography.com/anatoliykmetyuk} \\ \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Cheat Sheet}} \\ \vspace{-2pt}Published 22nd January, 2016.\\ Updated 6th May, 2016.\\ Page {\thepage} of \pageref{LastPage}. \end{tabulary} \vfill \columnbreak \begin{tabulary}{5.8cm}{L} \SetRowColor{FootBackground} \mymulticolumn{1}{p{5.377cm}}{\bf\textcolor{white}{Sponsor}} \\ \SetRowColor{white} \vspace{-5pt} %\includegraphics[width=48px,height=48px]{dave.jpeg} Measure your website readability!\\ www.readability-score.com \end{tabulary} \end{multicols}} \begin{document} \raggedright \raggedcolumns % Set font size to small. Switch to any value % from this page to resize cheat sheet text: % www.emerson.emory.edu/services/latex/latex_169.html \footnotesize % Small font. \begin{multicols*}{2} \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Syntax}} \tn % Row 0 \SetRowColor{LightBackground} \{\{nobreak\}\}`import subscript.language\{\{nl\}\}import \seqsplit{subscript.Predef.\_`} & Top-level imports required in all SubScript sources. \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} `script a = {\emph{expr}}` & Script definition \tn % Row Count 5 (+ 1) % Row 2 \SetRowColor{LightBackground} `script..\{\{nl\}\}~~a = {\emph{expr}}\{\{nl\}\}~~b = {\emph{expr}}` & Shorthand script definition \tn % Row Count 9 (+ 4) % Row 3 \SetRowColor{white} `runScript({\emph{script\_name}})` & Run scripts like this \tn % Row Count 11 (+ 2) % Row 4 \SetRowColor{LightBackground} `{[} {\emph{expr}} {]}` & Prioritizing Parentheses (like "()" in "2 - (1 + 3)", just for scripts) \tn % Row Count 15 (+ 4) % Row 5 \SetRowColor{white} `{[}** {\emph{expr}} **{]}` & Launch Anchor \tn % Row Count 16 (+ 1) % Row 6 \SetRowColor{LightBackground} `{[}* {\emph{expr}} *{]}` & Launch \tn % Row Count 17 (+ 1) % Row 7 \SetRowColor{white} `@a: b` & Annotation \tn % Row Count 18 (+ 1) % Row 8 \SetRowColor{LightBackground} `@\{println(there)\}: a` & Also annotation. There points to the annotated expression node \tn % Row Count 22 (+ 4) % Row 9 \SetRowColor{white} `var x: Int = 3` & Variable declarations are possible in scripts \tn % Row Count 25 (+ 3) % Row 10 \SetRowColor{LightBackground} `let {\emph{scala\_expr}}` & Executes `{\emph{scala\_expr}}` as a tiny code fragment. \tn % Row Count 28 (+ 3) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.48 cm} x{5.52 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Sequential Operators}} \tn % Row 0 \SetRowColor{LightBackground} `a ; b`\{\{nobreak\}\} & Executes next operator as soon as current one has success \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} `a b` & Same as above \tn % Row Count 4 (+ 1) % Row 2 \SetRowColor{LightBackground} `a\{\{nl\}\}b` & Same as above \tn % Row Count 5 (+ 1) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.56 cm} x{5.44 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Parallel Operators}} \tn % Row 0 \SetRowColor{LightBackground} `a \&\& b`\{\{nobreak\}\} & {\bf{Non-strict and-parallelism}}. Succeeds iff all its operands do. On failure of one of the children terminates without success immediately. \tn % Row Count 6 (+ 6) % Row 1 \SetRowColor{white} `a \& b`\{\{nobreak\}\} & {\bf{Strict and-parallelism}}. Same as above, but if some of its children doesn't have success, it waits for the rest of the children to execute before terminating. \tn % Row Count 12 (+ 6) % Row 2 \SetRowColor{LightBackground} `a || b`\{\{nobreak\}\} & {\bf{Non-strict or-parallelism}}. Succeeds iff at least one of its children does. After a children succeeds, it terminates immediately with success. \tn % Row Count 18 (+ 6) % Row 3 \SetRowColor{white} `a | b`\{\{nobreak\}\} & {\bf{Strict or-parallelism}}. Same as above, but waits for the rest of the children after one succeeds. Has success immediately after at least one child succeeds (termination and success are not the same things). \tn % Row Count 26 (+ 8) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{3.92 cm} x{4.08 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Result Values}} \tn % Row 0 \SetRowColor{LightBackground} \{\{nobreak\}\}`runScript({\emph{script\_name}}).\$` & From Scala code, returns the result value of `{\emph{script\_name}}` script, as `Try{[}Any{]}`. \tn % Row Count 5 (+ 5) % Row 1 \SetRowColor{white} `a\textasciicircum{}` & From SubScript code, sets the result of the parent script to that of `a`. E.g. in `script foo = a\textasciicircum{} b c`, script `foo` will have a result of `a`. `b` and `c` are still executed as usually. \tn % Row Count 15 (+ 10) % Row 2 \SetRowColor{LightBackground} `a\textasciicircum{}\textasciicircum{}` & The result of the parent script becomes a `Seq{[}Any{]}`. The result of `a` is recorded into that `Seq` at the index equal to `a`'s current pass (that is, first pass in a loop will go to index 0, second - to 1 etc). \tn % Row Count 26 (+ 11) % Row 3 \SetRowColor{white} `a\textasciicircum{}\textasciicircum{}{\emph{int\_literal}}` & The result of the parent script becomes a tuple. `a`'s result is recorded at `{\emph{int\_literal}}`-th position to the tuple. E.g. `a\textasciicircum{}\textasciicircum{}1 b\textasciicircum{}\textasciicircum{}2` will result in a tuple with `\_1` set to `a`'s result and `\_2` - to `b`'s result. \tn % Row Count 37 (+ 11) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{3.92 cm} x{4.08 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Result Values (cont)}} \tn % Row 4 \SetRowColor{LightBackground} `\textasciicircum{}{\emph{literal}}` & Sets the result of the parent script to `{\emph{literal}}`. E.g. `\textasciicircum{}5`, `\textasciicircum{}"Foo"`, `\textasciicircum{}'x'`. \tn % Row Count 5 (+ 5) % Row 5 \SetRowColor{white} `\textasciicircum{}{\emph{literal}}\textasciicircum{}\textasciicircum{}` & Sets the result to `Seq{[}Any{]}`, records `{\emph{literal}}` under its `pass`'s index. \tn % Row Count 9 (+ 4) % Row 6 \SetRowColor{LightBackground} `\textasciicircum{}{\emph{literal}}\textasciicircum{}\textasciicircum{}{\emph{int\_literal}}` & Sets the result to a tuple, places this `{\emph{literal}}` under `{\emph{int\_literal}}`-th position in this tuple. \tn % Row Count 14 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{3.68 cm} x{4.32 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Scala Code Blocks}} \tn % Row 0 \SetRowColor{LightBackground} `\{! {\emph{scala block}} !\}` & {\bf{Normal}} code block. Activation, Execution, Deactivation. \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} `\{: {\emph{scala block}} :\}` & {\bf{Tiny}} code block. Execution on Activation. \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} `\{. {\emph{scala block}} .\}` & {\bf{Event-handling}} code block. Does not execute automatically, need manual execution. \tn % Row Count 11 (+ 5) % Row 3 \SetRowColor{white} `\{\{nobreak\}\}\{* {\emph{scala block}} *\}` & {\bf{Threaded}} code block. Executes from a new thread (all the other blocks execute from Script Executor's thread). \tn % Row Count 17 (+ 6) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{1.36 cm} x{6.64 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Special Operands}} \tn % Row 0 \SetRowColor{LightBackground} `{[}+{]}` & {\bf{Epsilon}}, or empty action. Has success immediately after activation. \tn % Row Count 3 (+ 3) % Row 1 \SetRowColor{white} `{[}-{]}` & {\bf{Delata}}, or deadlock. Terminates without success immediately after activation. \tn % Row Count 6 (+ 3) % Row 2 \SetRowColor{LightBackground} `...` & {\bf{Loop}}. When used as an operand to a sequence, loops the sequence. E.g. `a b ...` executes in order "a b a b a b" etc as an infinite loop. `a ... b` and `... a b` have same effect. \tn % Row Count 12 (+ 6) % Row 3 \SetRowColor{white} \seqsplit{`break`} & {\bf{Break}}. Breaks activation of its parent operator. \tn % Row Count 14 (+ 2) % Row 4 \SetRowColor{LightBackground} \seqsplit{`break}?` & {\bf{Optional break}}. Behaves like `break`, but resumes activation after an action happened in an operand activated before itself. \tn % Row Count 18 (+ 4) % Row 5 \SetRowColor{white} `..?` & {\bf{Optional break loop}}. Mixes together `break?` and `...` . \tn % Row Count 20 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{2.48 cm} x{5.52 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Alternative Operators}} \tn % Row 0 \SetRowColor{LightBackground} `a + b`\{\{nobreak\}\} & {\bf{Choice}}. Starts with `a` and `b` activated. When either starts executing, excludes another. \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} `a / b` & {\bf{Disruption}}. Executes `a` until `b` starts, then excludes (terminates) `a` and continues with `b`. If `a` gets terminated without `b` ever getting started, excludes `b`. \tn % Row Count 11 (+ 7) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Conditional Operators}} \tn % Row 0 \SetRowColor{LightBackground} \{\{nobreak\}\}`if {\emph{scala\_expr}} then {\emph{expr}} else {\emph{expr}}` & Executes `then` part if `scala\_expr` is `true`, otherwise - `else` part. \tn % Row Count 4 (+ 4) % Row 1 \SetRowColor{white} `do {\emph{expr}} then {\emph{expr}} else {\emph{expr}}` & Executes `do` part first. If it has success, executes `then` part, otherwise - `else` part. \tn % Row Count 9 (+ 5) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Dataflow}} \tn % Row 0 \SetRowColor{LightBackground} `a \textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(x: T)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textgreater{} b` & {\bf{Dataflow}}. Executes `a`, casts its result to type `T`, assigns it to `x` and executes `b` with `x` in scope. \tn % Row Count 6 (+ 6) % Row 1 \SetRowColor{white} `a \textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(x: T)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textgreater{} b\{\{nl\}\}+\textbackslash{}\textasciitilde{}/\textbackslash{}\textasciitilde{}(x: E)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textgreater{} c` & Dataflow with an extra clause to handle exceptions. If `a` succeeds, the behaviour is as in the case above. Otherwise, an exception with which `a` failed is casted to `E` (which must be `\textless{}: Throwable`) and handled by `c`. Like `catch` in `try-catch`. \tn % Row Count 19 (+ 13) % Row 2 \SetRowColor{LightBackground} `a \textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(x: T)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textgreater{} b\{\{nl\}\}+\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(y: A)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textgreater{} c\{\{nl\}\}+\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(z: B)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textgreater{} d` & Dataflow can arbitrary number of result-handling clauses and exception-handling clauses. \tn % Row Count 24 (+ 5) % Row 3 \SetRowColor{white} \{\{nobreak\}\}`a \textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(x: T)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textasciicircum{} {\emph{scala\_expr}}\{\{nl\}\}+\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(x: A)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textasciicircum{} {\emph{scala\_expr}}` & {\bf{Dataflow map}}. Similar to Dataflow, but runs the result of `a` through a given `{\emph{scala\_expr}}` and sets the result of it as the result of the parent script. \tn % Row Count 32 (+ 8) \end{tabularx} \par\addvspace{1.3em} \vfill \columnbreak \begin{tabularx}{8.4cm}{x{4 cm} x{4 cm} } \SetRowColor{DarkBackground} \mymulticolumn{2}{x{8.4cm}}{\bf\textcolor{white}{Dataflow (cont)}} \tn % Row 4 \SetRowColor{LightBackground} `a \textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textasciicircum{} f` & Shorthand for `a \textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}(x: T)\textbackslash{}\textasciitilde{}\textbackslash{}\textasciitilde{}\textasciicircum{} f(x)`. \tn % Row Count 2 (+ 2) \hhline{>{\arrayrulecolor{DarkBackground}}--} \end{tabularx} \par\addvspace{1.3em} % That's all folks \end{multicols*} \end{document}