\begin{document}
\input{subfileprefix}
\ifSubfilesClassLoaded{\appendix}{}
-\chapter{\texorpdfstring{\glsentrytext{CLEAN}}{Clean} for \texorpdfstring{\glsentrytext{HASKELL}}{Haskell} Programmers}%
+\chapter{\texorpdfstring{\glsentrytext{CLEAN}}{Clean} for \texorpdfstring{\glsentrytext{HASKELL}}{Haskell} programmers}%
\label{chp:clean_for_haskell_programmers}
This appendix is meant give people who are familiar with the \gls{FP} language \gls{HASKELL} a consise overview of the programming language \gls{CLEAN} and how it differs from \gls{HASKELL}.
\begin{document}
\input{subfileprefix}
-\ifSubfilesClassLoaded{\chapter*{Research Data Management}}{\chapter{Research Data Management}}%
+\ifSubfilesClassLoaded{\chapter*{Research data management}}{\chapter{Research data management}}%
\label{chp:research_data_management}
This thesis research has been carried out under the research data management policy of the Institute for Computing and Information Science of Radboud University, the Netherlands\footnote{\refurl{https://www.ru.nl/icis/research-data-management/}{\formatdate{20}{1}{2020}}}.
The following research datasets have been produced during this PhD research:
\begin{itemize}
- \item \Fullref{chp:classy_deep_embedding}
+ \item \Fullref{chp:classy_deep_embedding}:
\begin{itemize}
\item \rdmentry{\mlubbers}{2022}
{Literate Haskell/lhs2\TeX{} source code for the paper ``Deep Embedding with Class'': TFP 2022}
{Zenodo}{10.5281/zenodo.6416747}
\end{itemize}
\item \crtCref{prt:top}: \hspace{8.28992pt}\nameref{prt:top}:%
- \todo{add set for green?}%
\todo{add set for sum\-mer scho\-ol?}%
\begin{itemize}
+ \item \rdmentry{Crooijmans, S.\ (Radboud University); \mlubbers; \pkoopman}{2023}
+ {Code for the paper ``Reducing the Power Consumption of IoT with Task-Oriented Programming'': TFP 2022}
+ {Zenodo}{10.5281/zenodo.7634538} %chktex 8
\item \rdmentry{\mlubbers; \pkoopman; \rplasmeijer}{2020}
{Source code for the mTask language}
{DANS}{10.17026/dans-xx4-8zs9} %chktex 8
However, data types defined in the host language are not automatically available in the embedded language.
To do so, all the operations on the data type must be ported to the \gls{EDSL} resulting in a lot of boilerplate.
- This paper shows that by using metaprogramming, all first order user-defined data types can be automatically made first class in shallow \glspl{EDSL}.
+ This paper shows that by using metaprogramming, all first-order user-defined data types can be automatically made first class in shallow \glspl{EDSL}.
We show this by providing an implementation in \gls{TH} for a typical \gls{DSL} with two different semantics.
Furthermore, we show that by utilising quasiquotation, there is hardly any burden on the syntax.
Finally, the paper also serves as a gentle introduction to \gls{TH}.
Contrarily, adding semantics requires adapting all language constructs.
Lifting the functions to type classes, i.e.\ parametrising the constructs over the semantics, allows extension of the language both in constructs and in semantics orthogonally. This advanced style of embedding is called tagless-final or class-based shallow embedding \citep{kiselyov_typed_2012}.
-While it is often possible to lift values of a user-defined data type to a value in the \gls{DSL}, it is not possible to interact with it using \gls{DSL} constructs, they are not first-class citizens.
+While it is often possible to lift values of a user-defined data type to a value in the \gls{DSL}, it is not possible to interact with it using \gls{DSL} constructs, since they are not first-class citizens.
Concretely, it is not possible to
\begin{enumerate*}
To relieve the burden of adding all these functions, metaprogramming\nobreak---\nobreak\hskip0pt and custom quasiquoters---can be used.
Metaprogramming entails that some parts of the program are generated by a program itself, i.e.\ the program is data.
-Quasiquotation is a metaprogramming mechanism that allows entering verbatim code for which a---possibly user defined---translation is used to convert the verbatim code to host language AST nodes.
+Quasiquotation is a metaprogramming mechanism that allows entering verbatim code for which a---possibly user defined---translation is used to convert the verbatim code to host language \gls{AST} nodes.
Metaprogramming allows functions to be added to the program at compile time based on the structure of user-defined data types.
\subsection{Contributions of the paper}
infixl 7 /.
\end{lstHaskell}
-Division is an operation that undefined if the right operand is equal to zero.
+Division is an operation that is undefined if the right operand is equal to zero.
To capture this behaviour, the \haskellinline{Nothing} constructor from \haskellinline{Maybe} is used to represent errors.
-The right-hand side of the division operator is evaluated first.
+Both sides of the division operator are evaluated.
If the right-hand side is zero, the division is not performed and an error is returned instead:
\begin{lstHaskell}
\subsection{Functions}
Adding functions to the language is achieved by adding a multi-parameter class to the \gls{DSL}.
-The type of the class function allows for the implementation to only allow first order function by supplying the arguments in a tuple.
+The type of the class function allows for the implementation to only allow first-order functions by supplying the arguments in a tuple.
Furthermore, with the \haskellinline{:-} operator the syntax becomes usable.
Finally, by defining the functions as a \gls{HOAS} type safety is achieved \citep{pfenning_higher-order_1988,chlipala_parametric_2008}.
The complete definition looks as follows:
infix 1 :-
\end{lstHaskell}
-Using the \haskellinline{Function} type class can be used to define functions with little syntactic overhead.\footnote{The \GHCmod{BlockArguments} extension of GHC is used to reduce the number of brackets that allows lambda's to be an argument to a function without brackets}
+The \haskellinline{Function} type class is now used to define functions with little syntactic overhead\footnote{The \GHCmod{BlockArguments} extension of GHC is used to reduce the number of brackets that allows lambda's to be an argument to a function without brackets}.
The following listing shows an expression in the \gls{DSL} utilising two user-defined functions:
\begin{lstHaskell}
\end{lstHaskell}
\subsection{Data types}
-Lifting values from the host language to the \gls{DSL} is possible using the \haskellinline{lit} function as long as type of the value has instances for all the class constraints.
+Lifting values from the host language to the \gls{DSL} is possible using the \haskellinline{lit} function as long as the type of the value has instances for all the class constraints.
Unfortunately, once lifted, it is not possible to do anything with values of the user-defined data type other than passing them around.
It is not possible to construct new values from expressions in the \gls{DSL}, to deconstruct a value into the fields, nor to test of which constructor the value is.
Furthermore, while in the our language the only constraint is the automatically derivable \haskellinline{Show}, in real-world languages the class constraints may be very difficult to satisfy for complex types, for example serialisation to a single stack cell in the case of a compiler.
\gls{TH} is GHC's de facto metaprogramming system, implemented as a compiler extension together with a library \citep{sheard_template_2002}\citep[\citesection{6.13.1}]{ghc_team_ghc_2021}.
Readers already familiar with \gls{TH} can safely skip this section.
-\gls{TH} adds four main concepts to the language, na\-me\-ly AST data types, splicing, quasiquotation and reification.
-With this machinery, regular \gls{HASKELL} functions can be defined that are called at compile time, inserting generated code into the {AST}.
+\gls{TH} adds four main concepts to the language, na\-me\-ly \gls{AST} data types, splicing, quasiquotation and reification.
+With this machinery, regular \gls{HASKELL} functions can be defined that are called at compile time, inserting generated code into the \gls{AST}.
These functions are monadic functions operating in the \haskellinline{Q} monad.
The \haskellinline{Q} monad facilitates failure, reification and fresh identifier generation for hygienic macros \citep{kohlbecker_hygienic_1986}.
Within the \haskellinline{Q} monad, capturable and non-capturable identifiers can be generated using the \haskellinline{mkName} and \haskellinline{newName} functions respectively.
To achieve the goal of embedding data types in a \gls{DSL} we refrain from using these \emph{unsafe} features.
\subsection{Data types}
-Firstly, for all of \gls{HASKELL}'s AST elements, data types are provided that are mostly isomorphic to the actual data types used in the compiler.
+Firstly, for all of \gls{HASKELL}'s \gls{AST} elements, data types are provided that are mostly isomorphic to the actual data types used in the compiler.
With these data types, the entire syntax of a \gls{HASKELL} program can be specified.
Often, a data type is suffixed with the context, e.g.\ there is a \haskellinline{VarE} and a \haskellinline{VarP} for a variable in an expression or in a pattern respectively.
To give an impression of these data types, a selection of data types available in \gls{TH} is given below:
data Lit = CharL Char | StringL String | IntegerL Integer | ...
\end{lstHaskell}
-To ease creating AST data types in the \haskellinline{Q} monad, lowercase variants of the constructors are available that lift the constructor to the \haskellinline{Q} monad as.
+To ease creating \gls{AST} data types in the \haskellinline{Q} monad, lowercase variants of the constructors are available that lift the constructor to the \haskellinline{Q} monad.
For example, for the \haskellinline{LamE} constructor, the following \haskellinline{lamE} function is available.
\begin{lstHaskell}
\subsection{Splicing}
Special splicing syntax (\haskellinline{\$(...)}) marks functions for compile-time execution.
-Other than that they always produce a value of an AST data type, they are regular functions.
+Other than that they always produce a value of an \gls{AST} data type, they are regular functions.
Depending on the context and location of the splice, the result type is either a list of declarations, a type, an expression or a pattern.
The result of this function, when successful, is then spliced into the code and treated as regular code by the compiler.
Consequently, the code that is generated may not be type safe, in which case the compiler provides a type error on the generated code.
\subsection{Quasiquotation}
Another key concept of \gls{TH} is Quasiquotation, the dual of splicing \citep{bawden_quasiquotation_1999}.
While it is possible to construct entire programs using the provided data types, it is a little cumbersome.
-Using \emph{Oxford brackets} (\verb#[|# \ldots\verb#|]#) or single or double apostrophes, verbatim \gls{HASKELL} code can be entered that is converted automatically to the corresponding AST nodes easing the creation of language constructs.
+Using \emph{Oxford brackets} (\verb#[|# \ldots\verb#|]#) or single or double apostrophes, verbatim \gls{HASKELL} code can be entered that is converted automatically to the corresponding \gls{AST} nodes easing the creation of language constructs.
Depending on the context, different quasiquotes are used:
\begin{itemize*}
\item \haskellinline{[\|...\|]} or \haskellinline{[e\|...\|]} for expressions
\subsection{Reification}
Reification is the act of querying the compiler for information about a certain name.
-For example, reifying a type name results in information about the type and the corresponding AST nodes of the type's definition.
+For example, reifying a type name results in information about the type and the corresponding \gls{AST} nodes of the type's definition.
This information can then be used to generate code according to the structure of data types.
Reification is done using the \haskellinline{reify :: Name -> Q Info} function.
The \haskellinline{Info} type is an \gls{ADT} containing all the---known to the compiler---information about the matching type: constructors, instances, \etc.
It is possible to construct and deconstruct values from other \gls{DSL} expressions, and to perform tests on the constructor but with a clunky and unwieldy syntax.
They have become first-class citizens in a grotesque way.
For example, given that we have some language constructs to denote failure and conditionals\footnotemark, writing a list summation function in our \gls{DSL} would be done as follows.
-For the sake of the argument we take a little shortcut here and assume that the interpretation of the \gls{DSL} supports lazy evaluation by using the host language as a metaprogramming language as well, allowing us to use functions in the host language to contstruct expressions in the \gls{DSL}.
+For the sake of the argument we take a little shortcut here and assume that the interpretation of the \gls{DSL} supports lazy evaluation by using the host language as a metaprogramming language as well, allowing us to use functions in the host language to construct expressions in the \gls{DSL}.
\begin{lrbox}{\LstBox}
\begin{lstHaskell}[frame=,deletekeywords={if}]
The code between \emph{dsl} brackets (\haskellinline{[dsl\|...\|]}) is preprocessed by the \haskellinline{dsl} quasiquoter.
Because the functions are executed at compile time, errors---thrown using the \haskellinline{MonadFail} instance of the \haskellinline{Q} monad---in these functions result in compile time errors.
-The AST nodes produced by the quasiquoter are inserted into the location and checked as if they were written by the programmer.
+The \gls{AST} nodes produced by the quasiquoter are inserted into the location and checked as if they were written by the programmer.
To illustrate writing a custom quasiquoter, we show an implementation of a quasiquoter for binary literals.
The \haskellinline{bin} quasiquoter is only defined for expressions and parses subsequent zeros and ones as a binary number and splices it back in the code as a regular integer.
This location is inserted in the parsec parser so that errors are localised in the source code.
Then, the \haskellinline{expr} parser is called that returns an \haskellinline{Exp} in the \haskellinline{Q} monad.
The \haskellinline{expr} parser uses parsec's commodity expression parser primitive \haskellinline{buildExpressionParser}.
-The resulting parser translates the string directly into \gls{TH}'s AST data types in the \haskellinline{Q} monad.
+The resulting parser translates the string directly into \gls{TH}'s \gls{AST} data types in the \haskellinline{Q} monad.
The most interesting parser is the parser for the case expression that is an alternative in the basic expression parser \haskellinline{basic}.
A case expression is parsed when a keyword \haskellinline{case} is followed by an expression that is in turn followed by a non-empty list of matches.
A match is parsed when a pattern (\haskellinline{pat}) is followed by an arrow and an expression.
\Citet{shioda_libdsl_2014} used metaprogramming in the D programming language to create a \gls{DSL} toolkit.
They also programmatically generate parsers and a backend for either compiling or interpreting the \gls{IR}.
\Citet{blanchette_liquid_2022} use \gls{TH} to simplify the development of Liquid \gls{HASKELL} proofs.
-\Citet{folmer_high-level_2022} used \gls{TH} to synthesize C$\lambda$aSH \citep{baaij_digital_2015} abstract syntax trees to be processed.
+\Citet{folmer_high-level_2022} used \gls{TH} to synthesize C$\lambda$aSH \citep{baaij_digital_2015} \glspl{AST} to be processed.
In similar fashion, \citet{materzok_generating_2022} used \gls{TH} to translate YieldFSM programs to {C$\lambda$aSH}.
\subsubsection{Optimisation}
For example, \citet{lynagh_unrolling_2003} implemented various optimisations in \gls{TH} such as automatic loop unrolling.
The compile-time executed functions analyse the recursive function and unroll the recursion to a fixed depth to trade execution speed for program space.
Also, \citet{odonnell_embedding_2004} embedded Hydra, a hardware description language, in \gls{HASKELL} utilising \gls{TH}.
-Using intensional analysis of the AST, it detects cycles by labelling nodes automatically so that it can generate \emph{netlists}.
+Using intensional analysis of the \gls{AST}, it detects cycles by labelling nodes automatically so that it can generate \emph{netlists}.
The authors mention that alternatively this could have be done using a monad but this hampers equational reasoning greatly, which is a key property of Hydra.
Finally, \citet{viera_staged_2018} present a way of embedding attribute grammars in \gls{HASKELL} in a staged fashion.
Checking several aspects of the grammar is done at compile time using \gls{TH} while other safety checks are performed at runtime.
\subsubsection{\texorpdfstring{\Glsxtrlong{TTH}}{Typed Template Haskell}}\label{ssec_fcd:typed_template_haskell}
\Gls{TTH} is a very recent extension/alternative to normal \gls{TH} \citep{pickering_multi-stage_2019,xie_staging_2022}.
-Where in \gls{TH} you can manipulate arbitrary parts of the syntax tree, add top-level splices of data types, definitions and functions, in \gls{TTH} the programmer can only splice expressions but the abstract syntax tree fragments representing the expressions are well-typed by construction instead of untyped.
+Where in \gls{TH} you can manipulate arbitrary parts of the syntax tree, add top-level splices of data types, definitions and functions, in \gls{TTH} the programmer can only splice expressions but the \gls{AST} fragments representing the expressions are well-typed by construction instead of untyped.
\Citet{pickering_staged_2020} implemented staged compilation for the \emph{generics-sop} \citep{de_vries_true_2014} generics library to improve the efficiency of the code using \gls{TTH}.
\Citet{willis_staged_2020} used \gls{TTH} to remove the overhead of parsing combinators.
\topskip0pt
\vspace*{\fill}
\begin{centering}
- Voor Roos, Lotte en Elvira
+ voor Roos, Lotte en Elvira
\end{centering}
\vspace*{\fill}%
\item a general introduction to the topics and research directions;
\item a reading guide;
\item background material on the \glsxtrlong{IOT}, \glsxtrlongpl{DSL}, \glsxtrlong{TOP}, \gls{ITASK}, and \gls{MTASK};
- \item and a detailed overview of the scientific contributions.
+ \item and a detailed overview of the scientific contributions of this dissertation.
\end{itemize}
\end{chapterabstract}
\subsection{Other \texorpdfstring{\glsxtrshort{TOP}}{TOP} languages}
While \gls{ITASK} conceived \gls{TOP}, it is no longer the only \gls{TOP} system.
Some \gls{TOP} languages were created to fill a gap encountered in practise.
-Toppyt \citep{lijnse_toppyt_2022} is a general purpose \gls{TOP} language written in \gls{PYTHON} used to host frameworks for modelling \emph{command \& control} systems, and hTask \citep{lubbers_htask_2022}, a vessel for experimenting with asynchronous \glspl{SDS}.
+Toppyt \citep{lijnse_toppyt_2022} is a general purpose \gls{TOP} language written in \gls{PYTHON} used to host frameworks for modelling command \& control systems, and hTask \citep{lubbers_htask_2022}, a vessel for experimenting with asynchronous \glspl{SDS}.
Furthermore, some \gls{TOP} systems arose from Master's and Bachelor's thesis projects.
For example, \textmu{}Task \citep{piers_task-oriented_2016}, a \gls{TOP} language for modelling non-interruptible embedded systems in \gls{HASKELL}, and LTasks \citep{van_gemert_task_2022}, a \gls{TOP} language written in the dynamically typed programming language {LUA}.
Finally, there are \gls{TOP} languages with strong academic foundations.
-\Gls{TOPHAT} is a fully formally specified \gls{TOP} language designed to capture the essence of \gls{TOP} formally \citep{steenvoorden_tophat_2019}.
+\Gls{TOPHAT} is a fully formally specified \gls{TOP} language designed to capture the essence of \gls{TOP} \citep{steenvoorden_tophat_2019}.
Such a formal specification allows for symbolic execution, hint generation, but also the translation to \gls{ITASK} for actually performing the work \citep{steenvoorden_tophat_2022}.
\Citeauthor{steenvoorden_tophat_2022} distinguishes two instruments for \gls{TOP}: \gls{TOP} languages and \gls{TOP} engines.
The language is the \emph{formal} language for specifying interactive systems.
The papers of which I am first author are solely written by me, there were weekly meetings with the co-authors in which we discussed and refined the ideas.
\subsection{\Fullref{prt:tvt}}
-\Cref{prt:tvt} is based on a journal paper that quantitatively and qualitatively compares traditional \gls{IOT} architectures with \gls{IOT} systems using \gls{TOP}.
+\Cref{prt:tvt} is based on a journal paper that quantitatively and qualitatively compares traditional \gls{IOT} architectures with \gls{TOP} \gls{IOT} architectures.
This chapter is based on the conference paper and a journal paper extending it:
\begin{enumerate}[resume]
\item \emph{Tiered versus Tierless \glsxtrshort{IOT} Stacks: Comparing Smart Campus Software Architectures} \citep{lubbers_tiered_2020}\footnote{This work was partly funded by the 2019 Radboud-Glasgow Collaboration Fund.}\label{enum:iot20} compares traditional tiered programming to tierless architectures by comparing two implementations of a smart-campus application.
# Clean bbl file as well
$bibtex_use = 2;
+$bibtex = "bibtex8 --wolfgang %O %S";
# Clean mkindex files
$clean_ext .= ' %R.ist %R.xdy';
-% chktex-file 17
-% chktex-file 15
-% Fonts
-\usepackage[utf8]{inputenc} % Input encoding
-\usepackage[T2A,T1]{fontenc} % Font encoding
-\usepackage{lmodern} % Nicer font
-\usepackage{microtype} % Better kerning
-\usepackage{tipa} % IPA symbols
-\usepackage{stmaryrd} % short arrows
-\usepackage{textcomp} % upquote
-\usepackage{titlecaps} % titlecase commands
-\usepackage{amsmath} % extra math
-\usepackage{amssymb} % extra math symbols
-\usepackage{wasysym} % circle symbols
-\usepackage{relsize} % \smaller command
-\usepackage{siunitx} % typeset units
-\usepackage{xcolor} % colors
-\usepackage{fnpct} % footnotekerning
-\usepackage[all]{nowidow} % Kill widows and orphans
-\DeclareSIUnit\noop{\relax}
-\DeclareSIUnit\celcius{{}^{\circ}\kern-\scriptspace\mathsf{C}}
-\everymath{\it\/}
-\DeclareMathSymbol{\shortminus}{\mathbin}{AMSa}{"39} %chktex 18
+\usepackage[utf8]{inputenc} % Input encoding
+\usepackage[T2A,T1]{fontenc} % Font encoding
+
+% Typography, widows, orphans, fonts
+\input{preamble/typography}
% Internationalisation
-\usepackage[dutch,russian,british]{babel}
-\input{hyphenation}
-%\babelfont[russian]{rm}{Liberation Serif}
+\input{preamble/internationalisation}
% Papersize and layout
-\usepackage{geometry}
-\geometry{
- inner=25mm,
- outer=20mm,
- marginparsep=3mm,
- marginparwidth=13mm,
- top=25mm,
- bottom=20mm,
- paperwidth=17cm,
- paperheight=24cm,
-}
-\usepackage{pdflscape}
-\usepackage{float}
-\usepackage{newfloat}
-\DeclareFloatingEnvironment[
- fileext=loq,
- listname={List of definitions},
- name=Definition,
- placement=tbp,
- within=chapter,
- chapterlistsgaps=on,
- ]{equ}
-\usepackage{fancyhdr} % Custom headers and footers
-\usepackage[fit]{truncate}
-%\pagestyle{headings}
-\pagestyle{fancy}
-\fancyhead{}
-\fancyfoot{}
-\setlength{\unitlength}{18mm}
-\newcommand{\blob}{{\color{gray}\rule[-.2\unitlength]{2\unitlength}{.5\unitlength}}}
-\fancyhead[RE]{\truncate{.95\headwidth}{\rightmark}}
-\fancyhead[LO]{\truncate{.95\headwidth}{\leftmark}}
-\newcommand{\frontmatterfancy}[0]{
- \fancyhead[RO]{\thepage}
- \fancyhead[LE]{\thepage}
-}
-\newcommand{\mainmatterfancy}[0]{
- \fancyhead[RO]{
- \thepage%
- \begin{picture}(0,0)
- \put(1,-\value{chapter}){\blob}
- \end{picture}
- }
- \fancyhead[LE]{
- \begin{picture}(0,0)
- \put(-3,-\value{chapter}){\blob}
- \end{picture}%
- \thepage%
- }
-}
-\newcommand{\backmatterfancy}[0]{
- \fancyhead[RO]{
- \thepage%
- \begin{picture}(0,0)
- \put(1,-1){\blob}
- \end{picture}
- }
- \fancyhead[LE]{
- \begin{picture}(0,0)
- \put(-3,-1){\blob}
- \end{picture}%
- \thepage%
- }
-}
-\renewcommand{\chaptermark}[1]{\markboth{\chaptername\ \thechapter.\ #1}{}}
-\renewcommand{\sectionmark}[1]{\markright{\thesection.\ #1}}
-%\renewcommand{\chaptermark}[1]{\markboth{\MakeUppercase{\chaptername}\ \thechapter.\ #1}{}}
-%\renewcommand{\headrulewidth}{0pt}
-\renewcommand{\footrulewidth}{0pt}
-\usepackage{etoolbox} % To patch the chapter command
-% Have better page numbering in chapters
-\patchcmd{\chapter}{plain}{headings}{}{}
-\usepackage{epigraph} % Epigraph
-\renewcommand\partname{Episode} % Rename parts to episodes (rhapsody uhu)
-\addto\captionsbritish{\renewcommand{\partname}{Episode}}
-\usepackage{titlesec}
-\titleformat{\part}[block]
- {\Huge}
- {\partname~\thepart:}
- {20pt}
- {}
-% This is required to make \nameref work (https://tex.stackexchange.com/questions/211035/problems-with-nameref-not-refering-to-the-correct-label-x-titlesec)
-\makeatletter
-\let\titlesec@part\part%
-\renewcommand{\part}{\@ifstar\part@star\part@nostar}
-\def\part@star#1{\NR@gettitle{#1}\titlesec@part*{#1}}
-\def\part@nostar{\@ifnextchar[\part@nostar@opt\part@nostar@nopt} % chktex 9
-\def\part@nostar@nopt#1{\NR@gettitle{#1}\titlesec@part{#1}}
-\def\part@nostar@opt[#1]#2{\NR@gettitle{#1}\titlesec@part[#1]{#2}}
-\makeatother
-
-\usepackage{framed}
-\definecolor{lstbg}{gray}{.95}
-\definecolor{shadecolor}{named}{lstbg}
-\newenvironment{chapterabstract}{\begin{shaded}\begin{quotation}}{\end{quotation}\end{shaded}} %chktex 6
-
-% Increase the depth for the table of contents
-\setcounter{secnumdepth}{3}
-\renewcommand{\contentsname}{Table of Contents} % change the name of the TOC
-\AtBeginDocument{\addtocontents{toc}{\protect\thispagestyle{empty}}} % to remove page numbering from the TOC
-
-% (file) structure
-\usepackage[subpreambles=true]{standalone} % standalone figures
-%\usepackage{morewrites} % fix no more room for a new \write
-\usepackage{appendix} % subappendices, appendices per chapter
+\input{preamble/layout}
% Bibliography
-\usepackage[square]{natbib} % Cite bib entry completely
-\setlength{\bibsep}{0.0pt}
-%\def\bibfont{\small}
-%\bibliographystyle{alpha}
-\bibliographystyle{abbrvnat}
-%\apptocmd{\thebibliography}{\raggedright}{}{}
-\usepackage{bibentry} % Cite bib entry completely
-\nobibliography*
-\newcommand{\citeentry}[1]{\begin{NoHyper}\bibentry{#1}\end{NoHyper}. \citep{#1}}
-\newcommand{\refurl}[2]{\url{#1}, accessed on: #2}
-
-\makeatletter
-\newcommand{\citepage}[1]{p.~#1}
-\newcommand{\citepages}[1]{pp.~#1}
-\newcommand{\citechapter}[1]{\cref@chapter@name~#1}
-\newcommand{\citechapters}[1]{\cref@chapter@name@plural~#1}
-\newcommand{\citesection}[1]{\cref@section@name~#1}
-\newcommand{\citesections}[1]{\cref@section@name@plural~#1}
-%\newcommand{\citesection}[1]{\S.~#1}
-%\newcommand{\citesections}[1]{\S\S.~#1}
-\newcommand{\citeparagraph}[1]{\P.~#1}
-\newcommand{\citeparagraphs}[1]{\P\P.~#1}
-\newcommand{\citelisting}[1]{\cref@listing@name~#1}
-\makeatother
+\input{preamble/bibliography}
% Tables
-\usepackage{booktabs} % Nicer tables
-\usepackage{multirow} % Multirow cells
-\usepackage{tabularx} % Automatically wrapping tables
-\usepackage{longtable} % Tables spanning pages
-\usepackage{threeparttable} % Tables with footnotes
-
-% Pseudocode
-\usepackage[algochapter,linesnumbered,lined,boxed]{algorithm2e}
-% Fix the algorithm font
-\renewcommand\AlCapFnt{\normalfont}
+\input{preamble/table}
% Listings
\input{preamble/listings}
% Graphics
-\usepackage{graphicx} % Images
-\graphicspath{{img/},{intro/img},{top/img},{tvt/img}}
-\usepackage{dpfloat}
-\usepackage{caption} % subfigures/captionof
-\usepackage{subcaption}
-\usepackage{rotating}
-\usepackage{adjustbox} % Make table fit page
-\newcommand{\orcid}[1]{\href{https://orcid.org/#1}{\hspace{1mm}\includegraphics[width=1em]{orcid}\hspace{2mm} https://orcid.org/#1}}
-\usepackage{tikz}
-
-% Index
-%\usepackage{makeidx}
-%\makeindex% Enable the index
+\input{preamble/graphics}
-% Custom enumerations
-\usepackage[inline,shortlabels]{enumitem}
-\setlist{noitemsep}
-\setlist[description]{leftmargin=\parindent}
-
-% Hyperlinks and metadata
-\usepackage[hyphens]{url}
-\usepackage[pdflang={en-GB},pagebackref,breaklinks]{hyperref} % hyperlinks
-\usepackage{xr} % hyperlinks
-\renewcommand*{\backref}[1]{}
-\renewcommand*{\backrefalt}[4]{[{%
- \ifcase #1 not cited.\or p.~#2.\else pp. #2.\fi%chktex 1
-}]}
-\hypersetup{%
- pdftitle={\mytitle},
- pdfauthor={\myauthor},
- pdfkeywords={task-oriented programming, functional programming, domain specific languages, internet of things},
- hidelinks,
-}
-\usepackage[nodayofweek]{datetime} % Use a fixed document date
-\urlstyle{same}
-\usepackage{bookmark}
-\usepackage[noabbrev]{cleveref} % Easy references
-\usepackage{crossreftools} % Easy references
-\crefname{equ}{equation}{equations}
-\crefname{part}{episode}{episodes}
-\crefname{lstlisting}{listing}{listings}
-\crefname{equ}{definition}{definition}
-\usepackage{nameref} % to reference names of chapters
-\newcommand{\fullref}[1]{\crtcref{#1}: \nameref{#1}}
-\newcommand{\Fullref}[1]{\crtCref{#1}: \nameref{#1}}
-\creflabelformat{equation}{#2\textup{#1}#3}
+% Crossreferences, hyperlinks and metadata
+\input{preamble/crossref}
% Glossaries and acronyms
-\usepackage[nolangwarn,abbreviations,nonumberlist,prefix]{glossaries-extra}
-\setabbreviationstyle{long-short}
-\setabbreviationstyle[noexpand]{short-nolong}
-\Addlcwords{of}
-\usepackage{glossary-mcols}
-\pdfstringdefDisableCommands{%
- \def\glsxtrlong#1{}%
- \def\glsxtrlongpl#1{}%
- \def\glsxtrshort#1{}%
- \def\glsxtrshortpl#1{}%
- \def\acrfull#1{}%
- \def\acrfullpl#1{}%
- \def\Glsxtrlong#1{}%
- \def\Glsxtrlongpl#1{}%
- \def\Glsxtrshort#1{}%
- \def\Glsxtrshortpl#1{}%
- \def\Acrfull#1{}%
- \def\Acrfullpl#1{}%
- \def\gls#1{}%
- \def\glspl#1{}%
- \def\glsentrytext#1{}%
- \def\Gls#1{}%
- \def\Glspl#1{}%
- \def\Glsentrytext#1{}%
- \def\titlecap#1{}%
- \def\MakeUppercase#1{}%
-}
+\input{preamble/glossaries}
-% Initialize the glossaries
-\makeglossaries%
-\input{glossaries}
+% Custom commands
+\input{preamble/commands}
+% File structure, this must be last of the preamble
\usepackage{subfiles}
+% Metadata (only works in main document)
\ifSubfilesClassLoaded{}{
\usepackage{xmpincl}
\includexmp{CC_Attribution-NoDerivatives_4.0_International}
}
-
-% Custom commands
-\newcommand{\GHCmod}[1]{\texttt{#1}}
-\newcommand{\aramsingh}{Ramsingh, A.\ (University of Glasgow)}
-\newcommand{\dcolon}[0]{\mathbin{::}}
-\newcommand{\doifmt}[1]{\href{https://doi.org/#1}{#1}}
-\newcommand{\etc}{{\fontfamily{cmr}\selectfont{\itshape\/\&\kern-0.2em c}}}
-\newcommand{\jsinger}{Singer, dr.\ J.\ (University of Glasgow)}
-\newcommand{\mlubbers}{Lubbers, M.\ (Radboud University)}
-\newcommand{\pkoopman}{Koopman, dr.\ P.\ (Radboud University)}
-\newcommand{\ptrinder}{Trinder, prof.~dr.\ P.\ (University of Glasgow)}
-\newcommand{\rdmentry}[5]{#1 (#2): #3. #4.\ \doifmt{#5}}
-\newcommand{\rewriterate}[2]{\langle{}\mathit{#1}, \mathit{#2}\rangle{}}
-\newcommand{\requiresGHCmod}[2][]{\footnote{Requires \GHCmod{#2} to be enabled. #1}}
-\newcommand{\rplasmeijer}{Plasmeijer, prof.\ dr.\ ir.\ R.\ (Radboud University)}
-\newcommand{\erasmusplus}{ERASMUS\raisebox{.25ex}{+}}
-\newcommand{\imtask}{\gls{ITASK}\slash\gls{MTASK}}
-\newcommand{\citask}{\gls{CLEAN}\slash\gls{ITASK}}
-\newcommand{\Citask}{\Gls{CLEAN}\slash\gls{ITASK}}
-\newcommand{\cmtask}{\gls{CLEAN}\slash\gls{MTASK}}
-\newcommand{\Cmtask}{\Gls{CLEAN}\slash\gls{MTASK}}
-\newcommand{\cimtask}{\gls{CLEAN}\slash\gls{ITASK}\slash\gls{MTASK}}
-\newcommand{\Cimtask}{\Gls{CLEAN}\slash\gls{ITASK}\slash\gls{MTASK}}
-\newcommand{\ccpp}{\texorpdfstring{\gls{C}\slash\gls{CPP}}{C\slash{}C\texttt{++}}}
-\newcommand{\Ccpp}{\texorpdfstring{\Gls{C}\slash\gls{CPP}}{C\slash{}C\texttt{++}}}
-\newcommand{\stacksize}[1]{\parallel#1\parallel}
-
-\makeatletter
-\newenvironment{compilationscheme}
- {\allowdisplaybreaks\startalign}
- {\endalign}
-\makeatother
--- /dev/null
+\usepackage[square]{natbib} % Cite bib entry completely
+\setlength{\bibsep}{0.0pt}
+%\def\bibfont{\small}
+%\setcitestyle{numbers}
+%\bibliographystyle{alpha}
+\bibliographystyle{abbrvnat}
+%\apptocmd{\thebibliography}{\raggedright}{}{}
+\usepackage{bibentry} % Cite bib entry completely
+\nobibliography*
+\newcommand{\citeentry}[1]{\begin{NoHyper}\bibentry{#1}\end{NoHyper}. \citep{#1}}
+\newcommand{\refurl}[2]{\url{#1}, accessed on: #2}
+
+\makeatletter
+\newcommand{\citepage}[1]{p.~#1}
+\newcommand{\citepages}[1]{pp.~#1}
+\newcommand{\citechapter}[1]{\cref@chapter@name~#1}
+\newcommand{\citechapters}[1]{\cref@chapter@name@plural~#1}
+\newcommand{\citesection}[1]{\cref@section@name~#1}
+\newcommand{\citesections}[1]{\cref@section@name@plural~#1}
+%\newcommand{\citesection}[1]{\S.~#1}
+%\newcommand{\citesections}[1]{\S\S.~#1}
+\newcommand{\citeparagraph}[1]{\P.~#1}
+\newcommand{\citeparagraphs}[1]{\P\P.~#1}
+\newcommand{\citelisting}[1]{\cref@listing@name~#1}
+\makeatother
--- /dev/null
+% Custom commands
+\newcommand{\GHCmod}[1]{\texttt{#1}}
+\newcommand{\aramsingh}{Ramsingh, A.\ (University of Glasgow)}
+\newcommand{\dcolon}[0]{\mathbin{::}}
+\newcommand{\doifmt}[1]{\href{https://doi.org/#1}{#1}}
+\newcommand{\etc}{{\fontfamily{cmr}\selectfont{\itshape\/\&\kern-0.2em c}}}
+\newcommand{\jsinger}{Singer, dr.\ J.\ (University of Glasgow)}
+\newcommand{\mlubbers}{Lubbers, M.\ (Radboud University)}
+\newcommand{\pkoopman}{Koopman, dr.\ P.\ (Radboud University)}
+\newcommand{\ptrinder}{Trinder, prof.~dr.\ P.\ (University of Glasgow)}
+\newcommand{\rdmentry}[5]{#1 (#2): #3. #4.\ \doifmt{#5}}
+\newcommand{\rewriterate}[2]{\langle{}\mathit{#1}, \mathit{#2}\rangle{}}
+\newcommand{\requiresGHCmod}[2][]{\footnote{Requires \GHCmod{#2} to be enabled. #1}}
+\newcommand{\rplasmeijer}{Plasmeijer, prof.\ dr.\ ir.\ R.\ (Radboud University)}
+\newcommand{\erasmusplus}{ERASMUS\raisebox{.25ex}{+}}
+\newcommand{\imtask}{\gls{ITASK}\slash\gls{MTASK}}
+\newcommand{\citask}{\gls{CLEAN}\slash\gls{ITASK}}
+\newcommand{\Citask}{\Gls{CLEAN}\slash\gls{ITASK}}
+\newcommand{\cmtask}{\gls{CLEAN}\slash\gls{MTASK}}
+\newcommand{\Cmtask}{\Gls{CLEAN}\slash\gls{MTASK}}
+\newcommand{\cimtask}{\gls{CLEAN}\slash\gls{ITASK}\slash\gls{MTASK}}
+\newcommand{\Cimtask}{\Gls{CLEAN}\slash\gls{ITASK}\slash\gls{MTASK}}
+\newcommand{\ccpp}{\texorpdfstring{\gls{C}\slash\gls{CPP}}{C\slash{}C\texttt{++}}}
+\newcommand{\Ccpp}{\texorpdfstring{\Gls{C}\slash\gls{CPP}}{C\slash{}C\texttt{++}}}
+\newcommand{\stacksize}[1]{\parallel#1\parallel}
+
+\makeatletter
+\newenvironment{compilationscheme}
+ {\allowdisplaybreaks\startalign}
+ {\endalign}
+\makeatother
--- /dev/null
+\usepackage[hyphens]{url}
+\usepackage[pdflang={en-GB},pagebackref,breaklinks]{hyperref} % hyperlinks
+\usepackage{xr} % hyperlinks
+\renewcommand*{\backref}[1]{}
+\renewcommand*{\backrefalt}[4]{[{%
+ \ifcase #1 not cited.\or p.~#2.\else pp. #2.\fi%chktex 1
+}]}
+\hypersetup{%
+ pdftitle={\mytitle},
+ pdfauthor={\myauthor},
+ pdfkeywords={task-oriented programming, functional programming, domain specific languages, internet of things},
+ hidelinks,
+}
+\usepackage[nodayofweek]{datetime} % Use a fixed document date
+\urlstyle{same}
+\usepackage{bookmark}
+\usepackage[noabbrev]{cleveref} % Easy references
+\usepackage{crossreftools} % Easy references
+\crefname{equ}{equation}{equations}
+\crefname{part}{episode}{episodes}
+\crefname{lstlisting}{listing}{listings}
+\crefname{equ}{definition}{definition}
+\usepackage{nameref} % to reference names of chapters
+\newcommand{\fullref}[1]{\crtcref{#1}: \nameref{#1}}
+\newcommand{\Fullref}[1]{\crtCref{#1}: \nameref{#1}}
+\creflabelformat{equation}{#2\textup{#1}#3}
+\usepackage[nolangwarn,abbreviations,nonumberlist,prefix]{glossaries-extra}
+\setabbreviationstyle{long-short}
+\setabbreviationstyle[noexpand]{short-nolong}
+\Addlcwords{of}
+\usepackage{glossary-mcols}
+\pdfstringdefDisableCommands{%
+ \def\glsxtrlong#1{}%
+ \def\glsxtrlongpl#1{}%
+ \def\glsxtrshort#1{}%
+ \def\glsxtrshortpl#1{}%
+ \def\acrfull#1{}%
+ \def\acrfullpl#1{}%
+ \def\Glsxtrlong#1{}%
+ \def\Glsxtrlongpl#1{}%
+ \def\Glsxtrshort#1{}%
+ \def\Glsxtrshortpl#1{}%
+ \def\Acrfull#1{}%
+ \def\Acrfullpl#1{}%
+ \def\gls#1{}%
+ \def\glspl#1{}%
+ \def\glsentrytext#1{}%
+ \def\Gls#1{}%
+ \def\Glspl#1{}%
+ \def\Glsentrytext#1{}%
+ \def\titlecap#1{}%
+ \def\MakeUppercase#1{}%
+}
+
+% Initialize the glossaries
+\makeglossaries%
+
% Acronym
\newcommand{\myacronym}[4][]{%
% \newacronym[type=\glsdefaulttype,#1]{#2}{#3}{#4}
\myacronym[category=noexpand]{3COWS}{3COWS}{The three ``CO'' (Composability, Comprehensibility, Correctness) winter school}
\myacronym{ADC}{ADC}{analog-to-digital converter}
\myacronym{ADT}{ADT}{algebraic data type}
+\myacronym{AST}{AST}{abstract syntax tree}
\myacronym{API}{API}{application programming interface}
\myacronym{ARDSL}{ARDSL}{\gls{ARDUINO} \glsxtrshort{DSL}}
\myacronym[category=noexpand]{CEFP}{CEFP}{Central European \glsxtrlong{FP} School}
--- /dev/null
+\usepackage{graphicx} % Images
+\graphicspath{{img/},{intro/img},{top/img},{tvt/img}}
+\usepackage{dpfloat}
+\usepackage{caption} % subfigures/captionof
+\usepackage{subcaption}
+\usepackage{rotating}
+\usepackage{adjustbox} % Make table fit page
+\newcommand{\orcid}[1]{\href{https://orcid.org/#1}{\hspace{1mm}\includegraphics[width=1em]{orcid}\hspace{2mm} https://orcid.org/#1}}
+\usepackage{tikz}
+\usepackage[subpreambles=true]{standalone} % standalone figures
+\usepackage[dutch,russian,british]{babel}
+%\babelfont[russian]{rm}{Liberation Serif}
+
\hyphenation{
Has-kell
qua-si-quo-ter
--- /dev/null
+\usepackage{geometry}
+\geometry{
+ inner=25mm,
+ outer=20mm,
+ marginparsep=3mm,
+ marginparwidth=13mm,
+ top=25mm,
+ bottom=20mm,
+ paperwidth=17cm,
+ paperheight=24cm,
+}
+\usepackage{pdflscape}
+
+\usepackage{fancyhdr} % Custom headers and footers
+\usepackage[fit]{truncate}
+\pagestyle{fancy}
+\fancyhead{}
+\fancyfoot{}
+\setlength{\unitlength}{18mm}
+\newcommand{\blob}{{\color{gray}\rule[-.2\unitlength]{2\unitlength}{.5\unitlength}}}
+\fancyhead[RE]{\truncate{.95\headwidth}{\rightmark}}
+\fancyhead[LO]{\truncate{.95\headwidth}{\leftmark}}
+\newcommand{\frontmatterfancy}[0]{
+ \fancyhead[RO]{\thepage}
+ \fancyhead[LE]{\thepage}
+}
+\newcommand{\mainmatterfancy}[0]{
+ \fancyhead[RO]{
+ \thepage%
+ \begin{picture}(0,0)
+ \put(1,-\value{chapter}){\blob}
+ \end{picture}
+ }
+ \fancyhead[LE]{
+ \begin{picture}(0,0)
+ \put(-3,-\value{chapter}){\blob}
+ \end{picture}%
+ \thepage%
+ }
+}
+\newcommand{\backmatterfancy}[0]{
+ \fancyhead[RO]{
+ \thepage%
+ \begin{picture}(0,0)
+ \put(1,-1){\blob}
+ \end{picture}
+ }
+ \fancyhead[LE]{
+ \begin{picture}(0,0)
+ \put(-3,-1){\blob}
+ \end{picture}%
+ \thepage%
+ }
+}
+\renewcommand{\chaptermark}[1]{\markboth{\chaptername\ \thechapter.\ #1}{}}
+\renewcommand{\sectionmark}[1]{\markright{\thesection.\ #1}}
+%\renewcommand{\chaptermark}[1]{\markboth{\MakeUppercase{\chaptername}\ \thechapter.\ #1}{}}
+%\renewcommand{\headrulewidth}{0pt}
+\renewcommand{\footrulewidth}{0pt}
+\usepackage{etoolbox} % To patch the chapter command
+% Have better page numbering in chapters
+\patchcmd{\chapter}{plain}{headings}{}{}
+\usepackage{epigraph} % Epigraph
+\renewcommand\partname{Episode} % Rename parts to episodes (rhapsody uhu)
+\addto\captionsbritish{\renewcommand{\partname}{Episode}}
+\usepackage{titlesec}
+\titleformat{\part}[block]
+ {\Huge}
+ {\partname~\thepart:}
+ {20pt}
+ {}
+
+% This is required to make \nameref work (https://tex.stackexchange.com/questions/211035/problems-with-nameref-not-refering-to-the-correct-label-x-titlesec)
+\makeatletter
+\let\titlesec@part\part%
+\renewcommand{\part}{\@ifstar\part@star\part@nostar}
+\def\part@star#1{\NR@gettitle{#1}\titlesec@part*{#1}}
+\def\part@nostar{\@ifnextchar[\part@nostar@opt\part@nostar@nopt} % chktex 9
+\def\part@nostar@nopt#1{\NR@gettitle{#1}\titlesec@part{#1}}
+\def\part@nostar@opt[#1]#2{\NR@gettitle{#1}\titlesec@part[#1]{#2}}
+\makeatother
+
+% Colored frames
+\usepackage{framed}
+\definecolor{lstbg}{gray}{.95}
+\definecolor{shadecolor}{named}{lstbg}
+\newenvironment{chapterabstract}{\begin{shaded}\begin{quotation}}{\end{quotation}\end{shaded}} %chktex 6
+
+% Increase the depth for the table of contents
+\setcounter{secnumdepth}{3}
+\renewcommand{\contentsname}{Table of Contents} % change the name of the TOC
+\AtBeginDocument{\addtocontents{toc}{\protect\thispagestyle{empty}}} % to remove page numbering from the TOC
+
+% Custom enumerations
+\usepackage[inline,shortlabels]{enumitem}
+\setlist{noitemsep}
+\setlist[description]{leftmargin=\parindent}
+
+% Custom floats
+\usepackage{float}
+\usepackage{newfloat}
+\DeclareFloatingEnvironment[
+ fileext=loq,
+ listname={List of definitions},
+ name=Definition,
+ placement=tbp,
+ within=chapter,
+ chapterlistsgaps=on,
+ ]{equ}
+
+% chapterappendices
+\usepackage{appendix}
\renewcommand*{\lstlistingname}{Listing (\gls{HASKELL})}
}
{}
+
+% Pseudocode
+\usepackage[algochapter,linesnumbered,lined,boxed]{algorithm2e}
+% Fix the algorithm font
+\renewcommand\AlCapFnt{\normalfont}
+
--- /dev/null
+\usepackage{booktabs} % Nicer tables
+\usepackage{multirow} % Multirow cells
+\usepackage{tabularx} % Automatically wrapping tables
+\usepackage{longtable} % Tables spanning pages
+\usepackage{threeparttable} % Tables with footnotes
--- /dev/null
+\usepackage{lmodern} % Nicer font
+\usepackage{microtype} % Better kerning
+\usepackage{tipa} % IPA symbols
+\usepackage{stmaryrd} % short arrows
+\usepackage{textcomp} % upquote
+\usepackage{titlecaps} % titlecase commands
+\usepackage{amsmath} % extra math
+\usepackage{amssymb} % extra math symbols
+\usepackage{wasysym} % circle symbols
+\usepackage{relsize} % \smaller command
+\usepackage{xcolor} % colors
+\usepackage{fnpct} % footnotekerning
+\usepackage[all]{nowidow} % Kill widows and orphans
+
+\usepackage{siunitx} % typeset units
+\DeclareSIUnit\noop{\relax}
+\DeclareSIUnit\celcius{{}^{\circ}\kern-\scriptspace\mathsf{C}}
+
+\everymath{\it\/}
+
+\DeclareMathSymbol{\shortminus}{\mathbin}{AMSa}{"39} %chktex 18
\subfile{dsl/class} % Deep embedding with class
\subfile{dsl/first} % First-class data types
-\part[\hspace{-8.28992pt}Orchestrating the Internet of Things using Task-Oriented Programming]{\\[2ex]\smaller{}Orchestrating the Internet of Things using Task-Oriented Programming}%
+\part[Orchestrating the Internet of Things using Task-O\-rien\-ted Programming]{\\[2ex]\smaller{}Orchestrating the Internet of Things using Task-O\-rien\-ted Programming}%
\label{prt:top}
-\subfile{top/4iot} % TOP for the IoT
-\subfile{top/lang} % mTask DSL
-\subfile{top/imp} % Implementation
-\subfile{top/int} % Integration with iTask
-\subfile{top/green} % Green computing
+\subfile{top/4iot} % TOP for the IoT
+\subfile{top/lang} % mTask DSL
+\subfile{top/imp} % Implementation
+\subfile{top/int} % Integration with iTask
+\subfile{top/green} % Green computing
\subfile{top/finale} % Conclusion
\part[Tiered versus Tierless Programming]{\\[2ex]\smaller{}Tiered versus Tierless Programming}%
However, it is interesting to see how far this can be extended.
The \gls{MTASK} language is a high-level \gls{DSL}, so it is obvious to introduce abstractions for edge computations.
For example, add \gls{TOP} support for machine learning on the edge device using TinyML \citep{sanchez-iborra_tinyml-enabled_2020}.
+\Citet{van_der_veen_mutable_2020} did preliminary work for embedding bounded datastructures such as arrays to the language.
+This could be continued and extended with support for sum types.
Another recent advance in \gls{IOT} programming is battery-less or even battery-free computing.
Instead of equipping the edge device with a battery, a capacitor is used in conjunction with some energy harvesting systems such as a solar panel.
De Roos briefly investigated these methods in their research internship.
A future directions could be to extend these findings and apply more \gls{EDSL} error message techniques on \gls{MTASK} as well.
+\subsection{Language features}
The serialisation and deserialisation of data types is automated both on the server and the \gls{MTASK} device using generic programming.
Using the structural information of the data type, the code responsible for the functionality is automatically generated.
Peripherals are not yet fully integrated in such a way.
\begin{document}
\input{subfileprefix}
-\chapter{Could Tierless Languages Reduce \texorpdfstring{\glsxtrshort{IOT}}{IoT} Development Grief?}%
+\chapter{Could tierless languages reduce \texorpdfstring{\glsxtrshort{IOT}}{IoT} development grief?}%
\label{chp:smart_campus}
\begin{chapterabstract}